Packages and functions

library(ggplot2)
library(plyr)
library(dplyr)
library(car)
library(fitdistrplus)
library(tidyr)
library(tidyverse)
library(ggtext)
library(lme4)
library(lmerTest)
library(emmeans)
library(glmmTMB)
library(ggbreak)
library(nlme)
library(cxr)
library(MASS)
library(mvtnorm)
library(DescTools)
library(phia)
library(performance)
library(DHARMa)
library(effects)
library(cowplot)

theme_ines<-theme(axis.text = element_text(size=14), axis.title = element_text(size=14, face="bold"), legend.text = element_text(size=12), strip.text = element_text(size=14), plot.title = element_text(size=14, face="bold"), panel.grid=element_line(colour="white"), panel.background = element_rect(fill="white") , axis.line = element_line(size = 0.5, linetype = "solid",
                                   colour = "black"), strip.background = element_rect(fill="white"))

save_plot<-function(dir, width=15, height=10, ...){
  ggsave(dir, width = width, height = height, units = c("cm"))
}

Env<-c("Water", "Cadmium")
names(Env)<-c("N", "Cd")

1 - Importing data and checking it

coex<-read.csv("Data_cadmium/Data_for_R/Coexistence Cd_G42_checked.csv", header=TRUE) # Data from the coexistence experiment
ca_raw<-read.csv(file = "Data_cadmium/Data_for_R/CompetitiveAbility Cd_G40_complete.csv", header=TRUE) # cdata from the competitive ability

str(ca_raw) 
'data.frame':   3680 obs. of  24 variables:
 $ Block             : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Rep               : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Box               : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Leaf              : int  3 4 3 4 3 4 3 4 3 4 ...
 $ Disk              : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Env               : chr  "N" "N" "Cd" "Cd" ...
 $ FocalSR           : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR            : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens              : int  1 1 1 1 2 2 2 2 4 4 ...
 $ Type              : chr  "INTRA" "INTRA" "INTRA" "INTRA" ...
 $ Focalfemale       : chr  "Te" "Te" "Te" "Te" ...
 $ FocalDead         : int  0 0 1 0 1 1 0 0 0 0 ...
 $ FocalDrowned      : int  0 0 0 0 0 0 0 0 0 0 ...
 $ FocalMissing      : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumbDeadComp      : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumberOfEggs      : int  11 21 3 9 15 16 17 11 58 24 ...
 $ NumberOfEggsBelow : int  0 0 0 0 0 0 0 0 0 0 ...
 $ TeMales           : int  3 3 0 3 2 5 5 3 8 8 ...
 $ TeFemales         : int  6 9 2 5 2 10 4 4 9 6 ...
 $ TeQuiescentfemales: int  0 0 0 0 0 0 3 0 3 4 ...
 $ TuMales           : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuFemales         : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuQuiescentfemales: int  NA NA NA NA NA NA NA NA NA NA ...
 $ Observations      : chr  NA NA NA NA ...
# Summary of the data to be sure that everything is ok!
summary(as.factor(ca_raw$Foca_rawlSR))
integer(0)
ca_raw$Block2<-as.factor(ca_raw$Block)
ca_raw$Rep2<-as.factor(ca_raw$Rep)
ca_raw$Disk2<-as.factor(ca_raw$Disk)
ca_raw$Leaf2<-as.factor(ca_raw$Leaf)
ca_raw$Env2<-as.factor(ca_raw$Env)
ca_raw$FocalSR2<-as.factor(ca_raw$FocalSR)
ca_raw$CompSR2<-as.factor(ca_raw$CompSR)
ca_raw$Type2<-as.factor(ca_raw$Type)
ca_raw$Focal_Female2<-as.factor(ca_raw$Focalfemale)


regimeTu<-c("Tu \ncontrol", "Tu evolved \n in cadmium")
names(regimeTu)<-c("SR1", "SR2")

regimeTe<-c("Te \n control", "Te evolved \n in cadmium")
names(regimeTe)<-c("SR4", "SR5")

#Creating columns that are needed
ca_raw$Nr_Focal_Females_Tu_Alive_G0<-sapply(c(1:length(ca_raw$Block)), function(x){
  if(ca_raw$Focalfemale[x]=="Tu"){
    if(ca_raw$Type[x]=="INTRA"){
      a<-ca_raw$Dens[x]-ca_raw$FocalDead[x]-ca_raw$FocalDrowned[x]-ca_raw$FocalMissing[x]
    }else
      a<-1-ca_raw$FocalDead[x]-ca_raw$FocalDrowned[x]-ca_raw$FocalMissing[x]
    
  }else
    a<-NA
})

ca_raw$Nr_Focal_Females_Te_Alive_G0<-sapply(c(1:length(ca_raw$Block)), function(x){
  if(ca_raw$Focalfemale[x]=="Te"){
    if(ca_raw$Type[x]=="INTRA"){
      a<-ca_raw$Dens[x]-ca_raw$FocalDead[x]-ca_raw$FocalDrowned[x]-ca_raw$FocalMissing[x]
    }else
      a<-1-ca_raw$FocalDead[x]-ca_raw$FocalDrowned[x]-ca_raw$FocalMissing[x]
    
  }else
    a<-NA
})


ca_raw$Num_Comp_Tu_Alive_G0<-sapply(c(1:length(ca_raw$Block)), function(x){
  if(ca_raw$Focalfemale[x]=="Te"){
    if(ca_raw$Type[x]=="INTER"){
      a<-ca_raw$Dens[x]-ca_raw$NumbDeadComp[x]-1
    }else
      a<-NA
    
  }else
    a<-NA
})


ca_raw$Num_Comp_Te_Alive_G0<-sapply(c(1:length(ca_raw$Block)), function(x){
  if(ca_raw$Focalfemale[x]=="Tu"){
    if(ca_raw$Type[x]=="INTER"){
      a<-ca_raw$Dens[x]-ca_raw$NumbDeadComp[x]-1
    }else
      a<-NA
    
  }else
    a<-NA
})

ca_raw$Nr_Focal_Females_G0<-sapply(c(1:length(ca_raw$Block)), function(x){
    if(ca_raw$Type[x]=="INTRA"){
      a<-ca_raw$Dens[x]
    }else
      a<-1

})

ca_raw$Nr_Comp_Females_G0<-sapply(c(1:length(ca_raw$Block)), function(x){
      a<-ca_raw$Dens[x]-1

      a

})

# Removing rows where there were less than 0 females
ca_raw<-ca_raw[-c(which(ca_raw$Num_Comp_Te_Alive_G0<0),which(ca_raw$Num_Comp_Tu_Alive_G0<0), which(ca_raw$Nr_Focal_Females_Te_Alive_G0<0),which(ca_raw$Nr_Focal_Females_Tu_Alive_G0<0) ),]


# Removing virgin females
ca_raw_virgin<-ca_raw[c(which(ca_raw$TeFemales==0 &ca_raw$TeMales>0 & ca_raw$Focalfemale=="Te" ),which(ca_raw$TuFemales==0 &ca_raw$TuMales>0 & ca_raw$Focalfemale=="Tu" )),]

ca<-ca_raw[-c(which(ca_raw$TeFemales==0 &ca_raw$TeMales>0 & ca_raw$Focalfemale=="Te" ),which(ca_raw$TuFemales==0 &ca_raw$TuMales>0 & ca_raw$Focalfemale=="Tu" )),]

2 - Estimate growth rate per generation


ca[,c("Nr_Focal_Females_G0", "Dens", "Type")]


ca$GrowthRateOA<-sapply(c(1:length(ca[,1])), function(x){
  #print(x)
  if(ca$Focal_Female[x]=="Tu"){
    a<-ca$TuFemales[x]/ca$Nr_Focal_Females_G0[x]
  }else if(ca$Focal_Female[x]=="Te"){
    a<-ca$TeFemales[x]/ca$Nr_Focal_Females_G0[x]
  }else
    a<-NA
  
  a
})

ca$GrowthRateOA_Q<-sapply(c(1:length(ca[,1])), function(x){
  #print(x)
  if(ca$Focal_Female[x]=="Tu"){
    a<-(ca$TuFemales[x]+ca$TuQuiescentfemales[x])/ca$Nr_Focal_Females_G0[x]
  }else if(ca$Focal_Female[x]=="Te"){
    a<-(ca$TeFemales[x]+ca$TeQuiescentfemales[x])/ca$Nr_Focal_Females_G0[x]
  }else
    a<-NA
  
  a
})

3 - Estimate competitive ability & predict data

Here we have two differeny methods, using the cxr package or with the optim. We will also vary if we estimate lambda from the data or from the model and if using cxr with the nested approach is better or not. So the different hypothesis are

A - CXR normal: using cxr with the normal approach B - CXR lambda fixed: using cxr but lambda comes from the data C - CXR nested: lambda comes the data, and we use the same nested approach as the optim –> for that we can put intra as another species (column) D - optim normal: the same approach as used in Fragata 2022 E - optim lambda fixed: using optim, but lambda is fixed

In all the models we will use density -1 for the intra, which basically corresponds to the number of competitors.

A - CXR normal

cxr accepts a data frame with a first column called fitness with positive values and numeric columns with number of individuals. Each row is one individual. For multiple species the easier is to create a list, each with a data frame that has in the first column number of individuals produced and then the number of neighbours

this case we transformed all 0s into 1 (so that the log is 0) For that we need to add +1 to all data so that the variance is not changed

normal
dir.create("./NewAnalyses/cxr_normal", showWarnings = FALSE)

# modifying data frame to fit the type of setup that is need for CXR
forCXR_N<-subset(ca, Env=="N")[,c("Rep", "FocalSR", "CompSR", "Dens", "TeFemales", "TuFemales")]

forCXR_N$Focal<-mapvalues(forCXR_N$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))
forCXR_N$CompSR2<-mapvalues(forCXR_N$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))

forCXR_N$Comp<-sapply(c(1:length(forCXR_N[,1])), function(x){
  if(is.na(forCXR_N$CompSR2[x])){
    a<- forCXR_N$Focal[x]
  }else{
    a<-forCXR_N$CompSR2[x]
  }
  
  a
})

aux<-data.frame(SR1=rep(0, length(forCXR_N[,1])), SR2=rep(0, length(forCXR_N[,1])), SR4=rep(0, length(forCXR_N[,1])), SR5=rep(0, length(forCXR_N[,1])))

for(i in 1:length(forCXR_N[,1])){
  #coluna onde por focais
  colunaF<-which(colnames(aux)==forCXR_N$Focal[i])
  #coluna onde por competidors
  colunaC<-which(colnames(aux)==forCXR_N$Comp[i])
  
  #if its the same regime
  if(forCXR_N$Focal[i]==forCXR_N$Comp[i] & forCXR_N$Dens[i]==1){
    aux[i,colunaF]<-forCXR_N$Dens[i]-1
    
  }else if(forCXR_N$Focal[i]==forCXR_N$Comp[i]){
    aux[i,colunaF]<-forCXR_N$Dens[i]-1
  }else{ #if it is heterospecific then its -1 for the competitors (because of the focal) and its one for the focal
    aux[i,colunaC]<-forCXR_N$Dens[i]-1
    aux[i, colunaF]<-1
  }
  
}

forCXR_N<-cbind(forCXR_N, aux)

forCXR_N$fitness<-sapply(c(1:length(forCXR_N[,1])), function(x){
  colF<-which(colnames(forCXR_N)==forCXR_N$Focal[x])
  
  if(forCXR_N$Focal[x]=="SR1"){
    a<-forCXR_N$TuFemales[x]/forCXR_N$SR1[x]
  } else if(forCXR_N$Focal[x]=="SR2"){
    a<-forCXR_N$TuFemales[x]/forCXR_N$SR2[x]
  } else if(forCXR_N$Focal[x]=="SR4"){
    a<-forCXR_N$TeFemales[x]/forCXR_N$SR4[x]
  } else if(forCXR_N$Focal[x]=="SR5"){
    a<-forCXR_N$TeFemales[x]/forCXR_N$SR5[x]
  }
  
  a
})

#removing rows for which there is no data for fitness
forCXR_N<-forCXR_N[-which(is.na(forCXR_N$fitness)),]

# adding +1 to all data
#forCXR_N$fitness<-forCXR_N$fitness+1

forCXR_N[which(forCXR_N$fitness=="-Inf" | forCXR_N$fitness=="Inf"),"fitness"]<-0


# all data gets +1 because of the 0 problem
forCXR_N$fitness<-forCXR_N$fitness+1

# vector that tells which are the selection regimes, the columns have to have the same name
my.reg <- c("SR1", "SR2","SR4","SR5")

# Do list per replicate and environment
R1<-list(SR1= subset(forCXR_N, Rep==1 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(forCXR_N, Rep==1 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(forCXR_N, Rep==1 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(forCXR_N, Rep==1 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R2<-list(SR1= subset(forCXR_N, Rep==2 & Focal=="SR1")[,c("fitness", "SR1", "SR4", "SR5")], SR4= subset(forCXR_N, Rep==2 & Focal=="SR4")[,c("fitness", "SR1", "SR4", "SR5")], SR5= subset(forCXR_N, Rep==2 & Focal=="SR5")[,c("fitness", "SR1", "SR4", "SR5")])

R3<-list(SR1= subset(forCXR_N, Rep==3 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(forCXR_N, Rep==3 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(forCXR_N, Rep==3 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(forCXR_N, Rep==3 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R4<-list(SR1= subset(forCXR_N, Rep==4 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(forCXR_N, Rep==4 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(forCXR_N, Rep==4 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(forCXR_N, Rep==4 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R5<-list(SR1= subset(forCXR_N, Rep==5 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(forCXR_N, Rep==5 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(forCXR_N, Rep==5 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(forCXR_N, Rep==5 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])


obs.R1_w0<-cxr_pm_multifit(data = R1,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

str(obs.R1_w0)
List of 16
 $ model_name                 : chr "RK_pm_alpha_pairwise_lambdacov_none_alphacov_none"
 $ data                       :List of 4
  ..$ SR1:'data.frame': 83 obs. of  5 variables:
  .. ..$ fitness: num [1:83] 1 5 11 1 6 ...
  .. ..$ SR1    : num [1:83] 0 1 1 3 3 9 9 0 1 3 ...
  .. ..$ SR2    : num [1:83] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ SR4    : num [1:83] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ SR5    : num [1:83] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ SR2:'data.frame': 83 obs. of  5 variables:
  .. ..$ fitness: num [1:83] 1 1 3 2 4.33 ...
  .. ..$ SR1    : num [1:83] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ SR2    : num [1:83] 0 0 1 3 3 9 9 0 0 1 ...
  .. ..$ SR4    : num [1:83] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ SR5    : num [1:83] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ SR4:'data.frame': 92 obs. of  5 variables:
  .. ..$ fitness: num [1:92] 1 1 3 11 4 ...
  .. ..$ SR1    : num [1:92] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ SR2    : num [1:92] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ SR4    : num [1:92] 0 0 1 1 3 3 9 9 0 0 ...
  .. ..$ SR5    : num [1:92] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ SR5:'data.frame': 90 obs. of  5 variables:
  .. ..$ fitness: num [1:90] 1 6 12 10.7 13.7 ...
  .. ..$ SR1    : num [1:90] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ SR2    : num [1:90] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ SR4    : num [1:90] 0 0 0 0 0 0 0 0 0 0 ...
  .. ..$ SR5    : num [1:90] 0 1 1 3 3 9 9 0 1 1 ...
 $ taxa                       : chr [1:4] "SR1" "SR2" "SR4" "SR5"
 $ optimization_method        : chr "Nelder-Mead"
 $ initial_values             :List of 3
  ..$ lambda     : num 1
  ..$ alpha_intra: num 0.1
  ..$ alpha_inter: num 0.1
 $ fixed_terms                : NULL
 $ lambda                     : Named num [1:4] 2.79 2.07 4.84 5.07
  ..- attr(*, "names")= chr [1:4] "SR1" "SR2" "SR4" "SR5"
 $ alpha_matrix               : num [1:4, 1:4] 0.0623 NA 0.0851 0.0432 NA ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:4] "SR1" "SR2" "SR4" "SR5"
  .. ..$ : chr [1:4] "SR1" "SR2" "SR4" "SR5"
 $ lambda_cov                 : NULL
 $ alpha_cov                  : NULL
 $ lambda_standard_error      : Named num [1:4] 0.386 0.275 0.998 1.002
  ..- attr(*, "names")= chr [1:4] "SR1" "SR2" "SR4" "SR5"
 $ alpha_standard_error       : NULL
 $ lambda_cov_standard_error  : NULL
 $ alpha_cov_standard_error   : NULL
 $ log_likelihood             : Named num [1:4] 88.7 81 133 124.4
  ..- attr(*, "names")= chr [1:4] "SR1" "SR2" "SR4" "SR5"
 $ alpha_matrix_standard_error: num [1:4, 1:4] 0.0235 NA 0.0458 0.0447 NA ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:4] "SR1" "SR2" "SR4" "SR5"
  .. ..$ : chr [1:4] "SR1_se" "SR2_se" "SR4_se" "SR5_se"
 - attr(*, "class")= chr "cxr_pm_multifit"
obs.R1_w0$lambda_standard_error
      SR1       SR2       SR4       SR5 
0.3860811 0.2753301 0.9980740 1.0016123 
obs.R1_w0$alpha_matrix_standard_error
        SR1_se     SR2_se     SR4_se     SR5_se
SR1 0.02345024         NA 0.03819883 0.02690249
SR2         NA 0.02238806 0.02908016 0.02955404
SR4 0.04577716 0.03797263 0.04069716         NA
SR5 0.04469513 0.04436930         NA 0.03718012
obs.R3_w0<-cxr_pm_multifit(data = R3,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

obs.R4_w0<-cxr_pm_multifit(data = R4,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

obs.R5_w0<-cxr_pm_multifit(data = R5,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

summary(obs.R1_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
           SR1          SR2        SR4
SR1 0.06226589           NA 0.02111418
SR2         NA -0.006361465 0.01646337
SR4 0.08509094  0.054815348 0.02134567
SR5 0.04318067  0.100217430         NA
           SR5
SR1 0.04056630
SR2 0.01664879
SR4         NA
SR5 0.02589732
summary(obs.R3_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
           SR1         SR2        SR4
SR1 0.08313077          NA 0.07025388
SR2         NA 0.029102575 0.02698001
SR4 0.06631461 0.034909359 0.01113335
SR5 0.02349603 0.004732142         NA
            SR5
SR1 0.055951893
SR2 0.004947367
SR4          NA
SR5 0.055838552
summary(obs.R4_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
           SR1         SR2         SR4
SR1 0.03224502          NA  0.04894165
SR2         NA 0.074574879  0.05857140
SR4 0.05809101 0.008017659 -0.01334212
SR5 0.08168851 0.071000640          NA
           SR5
SR1 0.06841501
SR2 0.03011274
SR4         NA
SR5 0.05467569
summary(obs.R5_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
             SR1        SR2        SR4
SR1 -0.001899959         NA 0.03713201
SR2           NA 0.04267937 0.07168209
SR4  0.071993005 0.09790030 0.03595535
SR5  0.124698580 0.09067722         NA
             SR5
SR1  0.009281002
SR2 -0.031603393
SR4           NA
SR5  0.045018753
# For replicate 2 we need to do it differently


obs.R2_w0_sr1<-cxr_pm_fit(data = R2[[1]],
                           focal_column = my.reg[1],
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

obs.R2_w0_sr4<-cxr_pm_fit(data = R2[[2]][which(R2[[2]][,"SR1"]==0),c("fitness", "SR4")],
                           focal_column =NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

obs.R2_w0_sr4_inter<-cxr_pm_fit(data = R2[[2]][which(R2[[2]][,"SR1"]!=0),c("fitness", "SR4")],
                           focal_column =NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(alpha_inter = 0.1),
                          fixed_terms = list(lambda=obs.R2_w0_sr4$lambda),
                           # no standard errors
                           bootstrap_samples = 200)

obs.R2_w0_sr5<-cxr_pm_fit(data = R2[[3]][which(R2[[3]][,"SR1"]==0),c("fitness", "SR5")],
                           focal_column =NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

obs.R2_w0_sr5_inter<-cxr_pm_fit(data = R2[[3]][which(R2[[3]][,"SR1"]!=0),c("fitness", "SR5")],
                           focal_column =NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(alpha_inter = 0.1),
                          fixed_terms = list(lambda=obs.R2_w0_sr5$lambda),
                           # no standard errors
                           bootstrap_samples = 200)


#ab<-abundance_projection(obs.R1_w0, timesteps = 1, initial_abundances = c(3,3,3,3))

rows in the alpha element of the returning list correspond to species i and columns to species j for each αij coefficient.

data table summary

cxr_param_w0<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("N"))
cxr_param_w0$Tu_lambda<-0
cxr_param_w0$Te_lambda<-0
cxr_param_w0$Tu_intra<-0
cxr_param_w0$Te_intra<-0
cxr_param_w0$Tu_inter<-0
cxr_param_w0$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_w0<-cxr_param_w0[-which(cxr_param_w0$Replicate==2 & cxr_param_w0$Tu_Regime=="SR2"),]


cxr_param_w0[which(cxr_param_w0$Replicate==1),"Tu_lambda"]<-obs.R1_w0$lambda[1:2]
cxr_param_w0[which(cxr_param_w0$Replicate==1),"Te_lambda"]<-obs.R1_w0$lambda[c(3,3,4,4)]

cxr_param_w0[which(cxr_param_w0$Replicate==2),"Tu_lambda"]<-obs.R2_w0_sr1$lambda
cxr_param_w0[which(cxr_param_w0$Replicate==2),"Te_lambda"]<-c(obs.R2_w0_sr4$lambda,obs.R2_w0_sr5$lambda)

cxr_param_w0[which(cxr_param_w0$Replicate==3),"Tu_lambda"]<-obs.R3_w0$lambda[1:2]
cxr_param_w0[which(cxr_param_w0$Replicate==3),"Te_lambda"]<-obs.R3_w0$lambda[c(3,3,4,4)]

cxr_param_w0[which(cxr_param_w0$Replicate==4),"Tu_lambda"]<-obs.R4_w0$lambda[1:2]
cxr_param_w0[which(cxr_param_w0$Replicate==4),"Te_lambda"]<-obs.R4_w0$lambda[c(3,3,4,4)]

cxr_param_w0[which(cxr_param_w0$Replicate==5),"Tu_lambda"]<-obs.R5_w0$lambda[1:2]
cxr_param_w0[which(cxr_param_w0$Replicate==5),"Te_lambda"]<-obs.R5_w0$lambda[c(3,3,4,4)]


cxr_param_w0[which(cxr_param_w0$Replicate==1),"Tu_intra"]<-rep(c(obs.R1_w0$alpha_matrix[1,1], obs.R1_w0$alpha_matrix[2,2]), 2)
cxr_param_w0[which(cxr_param_w0$Replicate==1),"Te_intra"]<-rep(c(obs.R1_w0$alpha_matrix[3,3], obs.R1_w0$alpha_matrix[4,4]), each=2)

cxr_param_w0[which(cxr_param_w0$Replicate==2),"Tu_intra"]<-obs.R2_w0_sr1$alpha_intra
cxr_param_w0[which(cxr_param_w0$Replicate==2),"Te_intra"]<-c(obs.R2_w0_sr4$alpha_inter, obs.R2_w0_sr5$alpha_inter)

cxr_param_w0[which(cxr_param_w0$Replicate==3),"Tu_intra"]<-rep(c(obs.R3_w0$alpha_matrix[1,1], obs.R3_w0$alpha_matrix[2,2]), 2)
cxr_param_w0[which(cxr_param_w0$Replicate==3),"Te_intra"]<-rep(c(obs.R3_w0$alpha_matrix[3,3], obs.R3_w0$alpha_matrix[4,4]), each=2)

cxr_param_w0[which(cxr_param_w0$Replicate==4),"Tu_intra"]<-rep(c(obs.R4_w0$alpha_matrix[1,1], obs.R4_w0$alpha_matrix[2,2]), 2)
cxr_param_w0[which(cxr_param_w0$Replicate==4),"Te_intra"]<-rep(c(obs.R4_w0$alpha_matrix[3,3], obs.R4_w0$alpha_matrix[4,4]), each=2)

cxr_param_w0[which(cxr_param_w0$Replicate==5),"Tu_intra"]<-rep(c(obs.R5_w0$alpha_matrix[1,1], obs.R5_w0$alpha_matrix[2,2]), 2)
cxr_param_w0[which(cxr_param_w0$Replicate==5),"Te_intra"]<-rep(c(obs.R5_w0$alpha_matrix[3,3], obs.R5_w0$alpha_matrix[4,4]), each=2)


cxr_param_w0[which(cxr_param_w0$Replicate==1),"Tu_inter"]<-c(obs.R1_w0$alpha_matrix[1,3], obs.R1_w0$alpha_matrix[2,3],obs.R1_w0$alpha_matrix[1,4], obs.R1_w0$alpha_matrix[2,4])
cxr_param_w0[which(cxr_param_w0$Replicate==1),"Te_inter"]<-c(obs.R1_w0$alpha_matrix[3,1], obs.R1_w0$alpha_matrix[3,2],obs.R1_w0$alpha_matrix[4,1], obs.R1_w0$alpha_matrix[4,2])

cxr_param_w0[which(cxr_param_w0$Replicate==2),"Tu_inter"]<-obs.R2_w0_sr1$alpha_inter
cxr_param_w0[which(cxr_param_w0$Replicate==2),"Te_inter"]<-c(obs.R2_w0_sr4_inter$alpha_inter, obs.R2_w0_sr5_inter$alpha_inter)

cxr_param_w0[which(cxr_param_w0$Replicate==3),"Tu_inter"]<-c(obs.R3_w0$alpha_matrix[1,3], obs.R3_w0$alpha_matrix[2,3],obs.R3_w0$alpha_matrix[1,4], obs.R3_w0$alpha_matrix[2,4])
cxr_param_w0[which(cxr_param_w0$Replicate==3),"Te_inter"]<-c(obs.R3_w0$alpha_matrix[3,1], obs.R3_w0$alpha_matrix[3,2],obs.R3_w0$alpha_matrix[4,1], obs.R3_w0$alpha_matrix[4,2])

cxr_param_w0[which(cxr_param_w0$Replicate==4),"Tu_inter"]<-c(obs.R4_w0$alpha_matrix[1,3], obs.R4_w0$alpha_matrix[2,3],obs.R4_w0$alpha_matrix[1,4], obs.R4_w0$alpha_matrix[2,4])
cxr_param_w0[which(cxr_param_w0$Replicate==4),"Te_inter"]<-c(obs.R4_w0$alpha_matrix[3,1], obs.R4_w0$alpha_matrix[3,2],obs.R4_w0$alpha_matrix[4,1], obs.R4_w0$alpha_matrix[4,2])

cxr_param_w0[which(cxr_param_w0$Replicate==5),"Tu_inter"]<-c(obs.R5_w0$alpha_matrix[1,3], obs.R5_w0$alpha_matrix[2,3],obs.R5_w0$alpha_matrix[1,4], obs.R5_w0$alpha_matrix[2,4])
cxr_param_w0[which(cxr_param_w0$Replicate==5),"Te_inter"]<-c(obs.R5_w0$alpha_matrix[3,1], obs.R5_w0$alpha_matrix[3,2],obs.R5_w0$alpha_matrix[4,1], obs.R5_w0$alpha_matrix[4,2])

### Lower

cxr_param_w0_lower<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("N"))
cxr_param_w0_lower$Tu_lambda<-0
cxr_param_w0_lower$Te_lambda<-0
cxr_param_w0_lower$Tu_intra<-0
cxr_param_w0_lower$Te_intra<-0
cxr_param_w0_lower$Tu_inter<-0
cxr_param_w0_lower$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_w0_lower<-cxr_param_w0_lower[-which(cxr_param_w0_lower$Replicate==2 & cxr_param_w0_lower$Tu_Regime=="SR2"),]


cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==1),"Tu_lambda"]<-rep(c(obs.R1_w0$lambda[1]-obs.R1_w0$lambda_standard_error[1], obs.R1_w0$lambda[2]-obs.R1_w0$lambda_standard_error[2]), 2)
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==1),"Te_lambda"]<-rep(c(obs.R1_w0$lambda[3]-obs.R1_w0$lambda_standard_error[3], obs.R1_w0$lambda[4]-obs.R1_w0$lambda_standard_error[4]), each=2)

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==2),"Tu_lambda"]<-obs.R2_w0_sr1$lambda-obs.R2_w0_sr1$lambda_standard_error
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==2),"Te_lambda"]<-c(obs.R2_w0_sr4$lambda-obs.R2_w0_sr4$lambda_standard_error,obs.R2_w0_sr5$lambda-obs.R2_w0_sr5$lambda_standard_error)

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==3),"Tu_lambda"]<-rep(c(obs.R3_w0$lambda[1]-obs.R3_w0$lambda_standard_error[1], obs.R3_w0$lambda[2]-obs.R3_w0$lambda_standard_error[2]), 2)
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==3),"Te_lambda"]<-rep(c(obs.R3_w0$lambda[3]-obs.R3_w0$lambda_standard_error[3], obs.R3_w0$lambda[4]-obs.R3_w0$lambda_standard_error[4]), each=2)

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==4),"Tu_lambda"]<-rep(c(obs.R4_w0$lambda[1]-obs.R4_w0$lambda_standard_error[1], obs.R4_w0$lambda[2]-obs.R4_w0$lambda_standard_error[2]), 2)
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==4),"Te_lambda"]<-rep(c(obs.R4_w0$lambda[3]-obs.R4_w0$lambda_standard_error[3], obs.R4_w0$lambda[4]-obs.R4_w0$lambda_standard_error[4]), each=2)

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==5),"Tu_lambda"]<-rep(c(obs.R5_w0$lambda[1]-obs.R5_w0$lambda_standard_error[1], obs.R5_w0$lambda[2]-obs.R5_w0$lambda_standard_error[2]), 2)
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==5),"Te_lambda"]<-rep(c(obs.R5_w0$lambda[3]-obs.R5_w0$lambda_standard_error[3], obs.R5_w0$lambda[4]-obs.R5_w0$lambda_standard_error[4]), each=2)


cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==1),"Tu_intra"]<-rep(c(obs.R1_w0$alpha_matrix[1,1]-obs.R1_w0$alpha_matrix_standard_error[1,1], obs.R1_w0$alpha_matrix[2,2]-obs.R1_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==1),"Te_intra"]<-rep(c(obs.R1_w0$alpha_matrix[3,3]-obs.R1_w0$alpha_matrix_standard_error[3,3], obs.R1_w0$alpha_matrix[4,4]-obs.R1_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==2),"Tu_intra"]<-obs.R2_w0_sr1$alpha_intra-obs.R2_w0_sr1$alpha_intra_standard_error
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==2),"Te_intra"]<-c(obs.R2_w0_sr4$alpha_inter-obs.R2_w0_sr4$alpha_inter_standard_error, obs.R2_w0_sr5$alpha_inter-obs.R2_w0_sr5$alpha_inter_standard_error)

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==3),"Tu_intra"]<-rep(c(obs.R3_w0$alpha_matrix[1,1]-obs.R3_w0$alpha_matrix_standard_error[1,1], obs.R3_w0$alpha_matrix[2,2]-obs.R3_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==3),"Te_intra"]<-rep(c(obs.R3_w0$alpha_matrix[3,3]-obs.R3_w0$alpha_matrix_standard_error[3,3], obs.R3_w0$alpha_matrix[4,4]-obs.R3_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==4),"Tu_intra"]<-rep(c(obs.R4_w0$alpha_matrix[1,1]-obs.R4_w0$alpha_matrix_standard_error[1,1], obs.R4_w0$alpha_matrix[2,2]-obs.R4_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==4),"Te_intra"]<-rep(c(obs.R4_w0$alpha_matrix[3,3]-obs.R4_w0$alpha_matrix_standard_error[3,3], obs.R4_w0$alpha_matrix[4,4]-obs.R4_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==5),"Tu_intra"]<-rep(c(obs.R5_w0$alpha_matrix[1,1]-obs.R5_w0$alpha_matrix_standard_error[1,1], obs.R5_w0$alpha_matrix[2,2]-obs.R5_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==5),"Te_intra"]<-rep(c(obs.R5_w0$alpha_matrix[3,3]-obs.R5_w0$alpha_matrix_standard_error[3,3], obs.R5_w0$alpha_matrix[4,4]-obs.R5_w0$alpha_matrix_standard_error[4,4]), each=2)


cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==1),"Tu_inter"]<-c(obs.R1_w0$alpha_matrix[1,3]-obs.R1_w0$alpha_matrix_standard_error[1,3], obs.R1_w0$alpha_matrix[2,3]-obs.R1_w0$alpha_matrix_standard_error[2,3],obs.R1_w0$alpha_matrix[1,4]-obs.R1_w0$alpha_matrix_standard_error[1,4], obs.R1_w0$alpha_matrix[2,4]-obs.R1_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==1),"Te_inter"]<-c(obs.R1_w0$alpha_matrix[3,1]-obs.R1_w0$alpha_matrix_standard_error[3,1], obs.R1_w0$alpha_matrix[3,2]-obs.R1_w0$alpha_matrix_standard_error[3,2],obs.R1_w0$alpha_matrix[4,1]-obs.R1_w0$alpha_matrix_standard_error[4,1], obs.R1_w0$alpha_matrix[4,2]-obs.R1_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==2),"Tu_inter"]<-obs.R2_w0_sr1$alpha_inter-obs.R2_w0_sr1$alpha_inter_standard_error
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==2),"Te_inter"]<-c(obs.R2_w0_sr4_inter$alpha_inter-obs.R2_w0_sr4_inter$alpha_inter_standard_error, obs.R2_w0_sr5_inter$alpha_inter-obs.R2_w0_sr5_inter$alpha_inter_standard_error)

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==3),"Tu_inter"]<-c(obs.R3_w0$alpha_matrix[1,3]-obs.R3_w0$alpha_matrix_standard_error[1,3], obs.R3_w0$alpha_matrix[2,3]-obs.R3_w0$alpha_matrix_standard_error[2,3],obs.R3_w0$alpha_matrix[1,4]-obs.R3_w0$alpha_matrix_standard_error[1,4], obs.R3_w0$alpha_matrix[2,4]-obs.R3_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==3),"Te_inter"]<-c(obs.R3_w0$alpha_matrix[3,1]-obs.R3_w0$alpha_matrix_standard_error[3,1], obs.R3_w0$alpha_matrix[3,2]-obs.R3_w0$alpha_matrix_standard_error[3,2],obs.R3_w0$alpha_matrix[4,1]-obs.R3_w0$alpha_matrix_standard_error[4,1], obs.R3_w0$alpha_matrix[4,2]-obs.R3_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==4),"Tu_inter"]<-c(obs.R4_w0$alpha_matrix[1,3]-obs.R4_w0$alpha_matrix_standard_error[1,3], obs.R4_w0$alpha_matrix[2,3]-obs.R4_w0$alpha_matrix_standard_error[2,3],obs.R4_w0$alpha_matrix[1,4]-obs.R4_w0$alpha_matrix_standard_error[1,4], obs.R4_w0$alpha_matrix[2,4]-obs.R4_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==4),"Te_inter"]<-c(obs.R4_w0$alpha_matrix[3,1]-obs.R4_w0$alpha_matrix_standard_error[3,1], obs.R4_w0$alpha_matrix[3,2]-obs.R4_w0$alpha_matrix_standard_error[3,2],obs.R4_w0$alpha_matrix[4,1]-obs.R4_w0$alpha_matrix_standard_error[4,1], obs.R4_w0$alpha_matrix[4,2]-obs.R4_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==5),"Tu_inter"]<-c(obs.R5_w0$alpha_matrix[1,3]-obs.R5_w0$alpha_matrix_standard_error[1,3], obs.R5_w0$alpha_matrix[2,3]-obs.R5_w0$alpha_matrix_standard_error[2,3],obs.R5_w0$alpha_matrix[1,4]-obs.R5_w0$alpha_matrix_standard_error[1,4], obs.R5_w0$alpha_matrix[2,4]-obs.R5_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0_lower[which(cxr_param_w0_lower$Replicate==5),"Te_inter"]<-c(obs.R5_w0$alpha_matrix[3,1]-obs.R5_w0$alpha_matrix_standard_error[3,1], obs.R5_w0$alpha_matrix[3,2]-obs.R5_w0$alpha_matrix_standard_error[3,2],obs.R5_w0$alpha_matrix[4,1]-obs.R5_w0$alpha_matrix_standard_error[4,1], obs.R5_w0$alpha_matrix[4,2]-obs.R5_w0$alpha_matrix_standard_error[4,2])

### upper

cxr_param_w0_upper<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("N"))
cxr_param_w0_upper$Tu_lambda<-0
cxr_param_w0_upper$Te_lambda<-0
cxr_param_w0_upper$Tu_intra<-0
cxr_param_w0_upper$Te_intra<-0
cxr_param_w0_upper$Tu_inter<-0
cxr_param_w0_upper$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_w0_upper<-cxr_param_w0_upper[-which(cxr_param_w0_upper$Replicate==2 & cxr_param_w0_upper$Tu_Regime=="SR2"),]


cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==1),"Tu_lambda"]<-rep(c(obs.R1_w0$lambda[1]+obs.R1_w0$lambda_standard_error[1], obs.R1_w0$lambda[2]+obs.R1_w0$lambda_standard_error[2]), 2)
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==1),"Te_lambda"]<-rep(c(obs.R1_w0$lambda[3]+obs.R1_w0$lambda_standard_error[3], obs.R1_w0$lambda[4]+obs.R1_w0$lambda_standard_error[4]), each=2)

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==2),"Tu_lambda"]<-obs.R2_w0_sr1$lambda+ obs.R2_w0_sr1$lambda_standard_error
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==2),"Te_lambda"]<-c(obs.R2_w0_sr4$lambda+obs.R2_w0_sr4$lambda_standard_error, obs.R2_w0_sr5$lambda+obs.R2_w0_sr5$lambda_standard_error)

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==3),"Tu_lambda"]<-rep(c(obs.R3_w0$lambda[1]+obs.R3_w0$lambda_standard_error[1], obs.R3_w0$lambda[2]+obs.R3_w0$lambda_standard_error[2]), 2)
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==3),"Te_lambda"]<-rep(c(obs.R3_w0$lambda[3]+obs.R3_w0$lambda_standard_error[3], obs.R3_w0$lambda[4]+obs.R3_w0$lambda_standard_error[4]), each=2)

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==4),"Tu_lambda"]<-rep(c(obs.R4_w0$lambda[1]+obs.R4_w0$lambda_standard_error[1], obs.R4_w0$lambda[2]+obs.R4_w0$lambda_standard_error[2]), 2)
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==4),"Te_lambda"]<-rep(c(obs.R4_w0$lambda[3]+obs.R4_w0$lambda_standard_error[3], obs.R4_w0$lambda[4]+obs.R4_w0$lambda_standard_error[4]), each=2)

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==5),"Tu_lambda"]<-rep(c(obs.R5_w0$lambda[1]+obs.R5_w0$lambda_standard_error[1], obs.R5_w0$lambda[2]+obs.R5_w0$lambda_standard_error[2]), 2)
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==5),"Te_lambda"]<-rep(c(obs.R5_w0$lambda[3]+obs.R5_w0$lambda_standard_error[3], obs.R5_w0$lambda[4]+obs.R5_w0$lambda_standard_error[4]), each=2)


cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==1),"Tu_intra"]<-rep(c(obs.R1_w0$alpha_matrix[1,1]+obs.R1_w0$alpha_matrix_standard_error[1,1], obs.R1_w0$alpha_matrix[2,2]+obs.R1_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==1),"Te_intra"]<-rep(c(obs.R1_w0$alpha_matrix[3,3]+obs.R1_w0$alpha_matrix_standard_error[3,3], obs.R1_w0$alpha_matrix[4,4]+obs.R1_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==2),"Tu_intra"]<-obs.R2_w0_sr1$alpha_intra+obs.R2_w0_sr1$alpha_intra_standard_error
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==2),"Te_intra"]<-c(obs.R2_w0_sr4$alpha_inter+obs.R2_w0_sr4$alpha_inter_standard_error,  obs.R2_w0_sr5$alpha_inter+obs.R2_w0_sr5$alpha_inter_standard_error)

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==3),"Tu_intra"]<-rep(c(obs.R3_w0$alpha_matrix[1,1]+obs.R3_w0$alpha_matrix_standard_error[1,1], obs.R3_w0$alpha_matrix[2,2]+obs.R3_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==3),"Te_intra"]<-rep(c(obs.R3_w0$alpha_matrix[3,3]+obs.R3_w0$alpha_matrix_standard_error[3,3], obs.R3_w0$alpha_matrix[4,4]+obs.R3_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==4),"Tu_intra"]<-rep(c(obs.R4_w0$alpha_matrix[1,1]+obs.R4_w0$alpha_matrix_standard_error[1,1], obs.R4_w0$alpha_matrix[2,2]+obs.R4_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==4),"Te_intra"]<-rep(c(obs.R4_w0$alpha_matrix[3,3]+obs.R4_w0$alpha_matrix_standard_error[3,3], obs.R4_w0$alpha_matrix[4,4]+obs.R4_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==5),"Tu_intra"]<-rep(c(obs.R5_w0$alpha_matrix[1,1]+obs.R5_w0$alpha_matrix_standard_error[1,1], obs.R5_w0$alpha_matrix[2,2]+obs.R5_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==5),"Te_intra"]<-rep(c(obs.R5_w0$alpha_matrix[3,3]+obs.R5_w0$alpha_matrix_standard_error[3,3], obs.R5_w0$alpha_matrix[4,4]+obs.R5_w0$alpha_matrix_standard_error[4,4]), each=2)


cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==1),"Tu_inter"]<-c(obs.R1_w0$alpha_matrix[1,3]+obs.R1_w0$alpha_matrix_standard_error[1,3], obs.R1_w0$alpha_matrix[2,3]+obs.R1_w0$alpha_matrix_standard_error[2,3],obs.R1_w0$alpha_matrix[1,4]+obs.R1_w0$alpha_matrix_standard_error[1,4], obs.R1_w0$alpha_matrix[2,4]+obs.R1_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==1),"Te_inter"]<-c(obs.R1_w0$alpha_matrix[3,1]+obs.R1_w0$alpha_matrix_standard_error[3,1], obs.R1_w0$alpha_matrix[3,2]+obs.R1_w0$alpha_matrix_standard_error[3,2],obs.R1_w0$alpha_matrix[4,1]+obs.R1_w0$alpha_matrix_standard_error[4,1], obs.R1_w0$alpha_matrix[4,2]+obs.R1_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==2),"Tu_inter"]<-c(obs.R2_w0_sr1$alpha_inter+obs.R2_w0_sr1$alpha_inter_standard_error)
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==2),"Te_inter"]<-c(obs.R2_w0_sr4_inter$alpha_inter+obs.R2_w0_sr4_inter$alpha_inter_standard_error, obs.R2_w0_sr5_inter$alpha_inter+obs.R2_w0_sr5_inter$alpha_inter_standard_error)

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==3),"Tu_inter"]<-c(obs.R3_w0$alpha_matrix[1,3]+obs.R3_w0$alpha_matrix_standard_error[1,3], obs.R3_w0$alpha_matrix[2,3]+obs.R3_w0$alpha_matrix_standard_error[2,3],obs.R3_w0$alpha_matrix[1,4]+obs.R3_w0$alpha_matrix_standard_error[1,4], obs.R3_w0$alpha_matrix[2,4]+obs.R3_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==3),"Te_inter"]<-c(obs.R3_w0$alpha_matrix[3,1]+obs.R3_w0$alpha_matrix_standard_error[3,1], obs.R3_w0$alpha_matrix[3,2]+obs.R3_w0$alpha_matrix_standard_error[3,2],obs.R3_w0$alpha_matrix[4,1]+obs.R3_w0$alpha_matrix_standard_error[4,1], obs.R3_w0$alpha_matrix[4,2]+obs.R3_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==4),"Tu_inter"]<-c(obs.R4_w0$alpha_matrix[1,3]+obs.R4_w0$alpha_matrix_standard_error[1,3], obs.R4_w0$alpha_matrix[2,3]+obs.R4_w0$alpha_matrix_standard_error[2,3],obs.R4_w0$alpha_matrix[1,4]+obs.R4_w0$alpha_matrix_standard_error[1,4], obs.R4_w0$alpha_matrix[2,4]+obs.R4_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==4),"Te_inter"]<-c(obs.R4_w0$alpha_matrix[3,1]+obs.R4_w0$alpha_matrix_standard_error[3,1], obs.R4_w0$alpha_matrix[3,2]+obs.R4_w0$alpha_matrix_standard_error[3,2],obs.R4_w0$alpha_matrix[4,1]+obs.R4_w0$alpha_matrix_standard_error[4,1], obs.R4_w0$alpha_matrix[4,2]+obs.R4_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==5),"Tu_inter"]<-c(obs.R5_w0$alpha_matrix[1,3]+obs.R5_w0$alpha_matrix_standard_error[1,3], obs.R5_w0$alpha_matrix[2,3]+obs.R5_w0$alpha_matrix_standard_error[2,3],obs.R5_w0$alpha_matrix[1,4]+obs.R5_w0$alpha_matrix_standard_error[1,4], obs.R5_w0$alpha_matrix[2,4]+obs.R5_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0_upper[which(cxr_param_w0_upper$Replicate==5),"Te_inter"]<-c(obs.R5_w0$alpha_matrix[3,1]+obs.R5_w0$alpha_matrix_standard_error[3,1], obs.R5_w0$alpha_matrix[3,2]+obs.R5_w0$alpha_matrix_standard_error[3,2],obs.R5_w0$alpha_matrix[4,1]+obs.R5_w0$alpha_matrix_standard_error[4,1], obs.R5_w0$alpha_matrix[4,2]+obs.R5_w0$alpha_matrix_standard_error[4,2])
Cadmium
# modifying data frame to fit the type of setup that is need for CXR
forCXR_Cd<-subset(ca, Env=="Cd")[,c("Rep", "FocalSR", "CompSR", "Dens", "TeFemales", "TuFemales")]

forCXR_Cd$Focal<-mapvalues(forCXR_Cd$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))
forCXR_Cd$CompSR2<-mapvalues(forCXR_Cd$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))

forCXR_Cd$Comp<-sapply(c(1:length(forCXR_Cd[,1])), function(x){
  if(is.na(forCXR_Cd$CompSR2[x])){
    a<- forCXR_Cd$Focal[x]
  }else{
    a<-forCXR_Cd$CompSR2[x]
  }
  
  a
})

aux<-data.frame(SR1=rep(0, length(forCXR_Cd[,1])), SR2=rep(0, length(forCXR_Cd[,1])), SR4=rep(0, length(forCXR_Cd[,1])), SR5=rep(0, length(forCXR_Cd[,1])))

for(i in 1:length(forCXR_Cd[,1])){
  #coluna onde por focais
  colunaF<-which(colnames(aux)==forCXR_Cd$Focal[i])
  #coluna onde por competidors
  colunaC<-which(colnames(aux)==forCXR_Cd$Comp[i])
  
  #if its the same regime
  if(forCXR_Cd$Focal[i]==forCXR_Cd$Comp[i] & forCXR_Cd$Dens[i]==1){
    aux[i,colunaF]<-forCXR_Cd$Dens[i]-1
    
  }else if(forCXR_Cd$Focal[i]==forCXR_Cd$Comp[i]){
    aux[i,colunaF]<-forCXR_Cd$Dens[i]-1
  }else{ #if it is heterospecific then its -1 for the competitors (because of the focal) and its one for the focal
    aux[i,colunaC]<-forCXR_Cd$Dens[i]-1
    aux[i, colunaF]<-1
  }
  
}

forCXR_Cd<-cbind(forCXR_Cd, aux)

forCXR_Cd$fitness<-sapply(c(1:length(forCXR_Cd[,1])), function(x){
  colF<-which(colnames(forCXR_Cd)==forCXR_Cd$Focal[x])
  
  if(forCXR_Cd$Focal[x]=="SR1"){
    a<-forCXR_Cd$TuFemales[x]/forCXR_Cd$SR1[x]
  } else if(forCXR_Cd$Focal[x]=="SR2"){
    a<-forCXR_Cd$TuFemales[x]/forCXR_Cd$SR2[x]
  } else if(forCXR_Cd$Focal[x]=="SR4"){
    a<-forCXR_Cd$TeFemales[x]/forCXR_Cd$SR4[x]
  } else if(forCXR_Cd$Focal[x]=="SR5"){
    a<-forCXR_Cd$TeFemales[x]/forCXR_Cd$SR5[x]
  }
  
  a
})

subset(ca, Env=="Cd" & Rep=="2" & FocalSR==5 &Type=="INTER")[,c("Rep", "FocalSR", "CompSR", "Dens", "TeFemales", "Block")]

#removing rows for which there is no data for fitness
#forCXR_Cd<-forCXR_Cd[-which(is.na(forCXR_Cd$fitness)),]
#forCXR_Cd$fitness<-forCXR_Cd$fitness+1

forCXR_Cd[which(forCXR_Cd$fitness=="-Inf" | forCXR_Cd$fitness=="Inf"),"fitness"]<-0

#0 to 1 to mainrain data
forCXR_Cd<-forCXR_Cd[-which(is.na(forCXR_Cd$fitness)),]
forCXR_Cd$fitness<-forCXR_Cd$fitness+1



# vector that tells which are the selection regimes, the columns have to have the same name
my.reg <- c("SR1", "SR2","SR4","SR5")

# Do list per replicate and environment
R1_Cd<-list(SR1= subset(forCXR_Cd, Rep==1 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(forCXR_Cd, Rep==1 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(forCXR_Cd, Rep==1 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(forCXR_Cd, Rep==1 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R2_Cd<-list(SR1= subset(forCXR_Cd, Rep==2 & Focal=="SR1")[,c("fitness", "SR1", "SR2","SR4", "SR5")], SR4= subset(forCXR_Cd, Rep==2 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(forCXR_Cd, Rep==2 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R3_Cd<-list(SR1= subset(forCXR_Cd, Rep==3 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(forCXR_Cd, Rep==3 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(forCXR_Cd, Rep==3 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(forCXR_Cd, Rep==3 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R4_Cd<-list(SR1= subset(forCXR_Cd, Rep==4 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(forCXR_Cd, Rep==4 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(forCXR_Cd, Rep==4 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(forCXR_Cd, Rep==4 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R5_Cd<-list(SR1= subset(forCXR_Cd, Rep==5 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(forCXR_Cd, Rep==5 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(forCXR_Cd, Rep==5 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(forCXR_Cd, Rep==5 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])


obs.R1_Cd_w0<-cxr_pm_multifit(data = R1_Cd,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)




# replicate 2 below


obs.R3_Cd_w0<-cxr_pm_multifit(data = R3_Cd,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples =10)

obs.R4_Cd_w0<-cxr_pm_multifit(data = R4_Cd,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

obs.R5_Cd_w0<-cxr_pm_multifit(data = R5_Cd,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

summary(obs.R1_Cd_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
             SR1         SR2        SR4
SR1  0.007357226          NA 0.02747775
SR2           NA 0.046099244 0.02454420
SR4 -0.017843057 0.016194109 0.02532583
SR5  0.041329244 0.009208599         NA
           SR5
SR1 0.01634495
SR2 0.03043861
SR4         NA
SR5 0.05166503
#summary(obs.R2_Cd_w0)
summary(obs.R3_Cd_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
           SR1          SR2          SR4
SR1 0.01183117           NA -0.005638143
SR2         NA  0.021130861  0.025735206
SR4 0.04642142 -0.026951900  0.009475739
SR5 0.04581416  0.000886977           NA
             SR5
SR1 -0.006037275
SR2  0.019139983
SR4           NA
SR5  0.032574031
summary(obs.R4_Cd_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
             SR1          SR2          SR4
SR1  0.002187775           NA  0.004587916
SR2           NA  0.004657604 -0.001765893
SR4 -0.051846899  0.014164460 -0.003713025
SR5  0.063991478 -0.003949514           NA
            SR5
SR1  0.01455484
SR2 -0.01844620
SR4          NA
SR5  0.03429801
summary(obs.R5_Cd_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
             SR1          SR2         SR4
SR1  0.022925211           NA 0.036058080
SR2           NA -0.014002673 0.012986026
SR4 -0.026519373  0.004816519 0.008233322
SR5  0.007813674  0.003917652          NA
             SR5
SR1 -0.026508822
SR2  0.004086218
SR4           NA
SR5  0.057530995
### For replicate I can't find good initial conditions, lets do this by hand

# obs.R2_Cd_w0<-cxr_pm_multifit(data = R2_Cd,
#                            focal_column = my.reg[c(1,3,4)],
#                            model_family = "BH",
#                            covariates = NULL,
#                           optimization_method = "Nelder-Mead",
#                           alpha_form = "pairwise",
#                           lambda_cov_form = "none",
#                           alpha_cov_form = "none",
#                            initial_values = list(lambda = 1,
#                                                  alpha_intra = 0.1,
#                                                  alpha_inter = 0.1),
#                           fixed_terms = NULL,
#                            # no standard errors
#                            bootstrap_samples =10)

# This one works well
obs.R2_Cd_w0_sr1<-cxr_pm_fit(data = R2_Cd[[1]],
                           focal_column = my.reg[1],
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

#for replicate 2 we will do the fitting by hand because we may need to scale the parameters

obs.R2_Cd_w0_sr4<-cxr_pm_fit(data = R2_Cd[[2]][which(R2_Cd[[2]][,"SR1"]==0),c("fitness", "SR4")],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)

 obs.R2_Cd_w0_sr5<-cxr_pm_fit(data = R2_Cd[[3]][which(R2_Cd[[3]][,"SR1"]==0),c("fitness", "SR5")],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(lambda = 1,
                                                 alpha_inter = 0.1),
                          fixed_terms = NULL,
                           # no standard errors
                           bootstrap_samples = 200)
 
obs.R2_Cd_w0_sr4_inter<-cxr_pm_fit(data = R2_Cd[[2]][which(R2_Cd[[2]][,"SR1"]!=0),c("fitness", "SR1")],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list( alpha_inter = 0.1),
                          fixed_terms = list(lambda=obs.R2_Cd_w0_sr4$lambda),
                           # no standard errors
                           bootstrap_samples = 200)

 obs.R2_Cd_w0_sr5_inter<-cxr_pm_fit(data = R2_Cd[[3]][which(R2_Cd[[3]][,"SR1"]!=0),c("fitness", "SR1")],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list( alpha_inter = 0.1),
                          fixed_terms = list(lambda=obs.R2_Cd_w0_sr5$lambda),
                           # no standard errors
                           bootstrap_samples = 200)
data table summary

cxr_param_w0C<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("Cd"))
cxr_param_w0C$Tu_lambda<-0
cxr_param_w0C$Te_lambda<-0
cxr_param_w0C$Tu_intra<-0
cxr_param_w0C$Te_intra<-0
cxr_param_w0C$Tu_inter<-0
cxr_param_w0C$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_w0C<-cxr_param_w0C[-which(cxr_param_w0C$Replicate==2 & cxr_param_w0C$Tu_Regime=="SR2"),]


cxr_param_w0C[which(cxr_param_w0C$Replicate==1),"Tu_lambda"]<-obs.R1_Cd_w0$lambda[1:2]
cxr_param_w0C[which(cxr_param_w0C$Replicate==1),"Te_lambda"]<-obs.R1_Cd_w0$lambda[c(3,3,4,4)]

cxr_param_w0C[which(cxr_param_w0C$Replicate==2),"Tu_lambda"]<-obs.R2_Cd_w0_sr1$lambda
cxr_param_w0C[which(cxr_param_w0C$Replicate==2),"Te_lambda"]<-c(obs.R2_Cd_w0_sr4$lambda, obs.R2_Cd_w0_sr5$lambda)

cxr_param_w0C[which(cxr_param_w0C$Replicate==3),"Tu_lambda"]<-obs.R3_Cd_w0$lambda[1:2]
cxr_param_w0C[which(cxr_param_w0C$Replicate==3),"Te_lambda"]<-obs.R3_Cd_w0$lambda[c(3,3,4,4)]

cxr_param_w0C[which(cxr_param_w0C$Replicate==4),"Tu_lambda"]<-obs.R4_Cd_w0$lambda[1:2]
cxr_param_w0C[which(cxr_param_w0C$Replicate==4),"Te_lambda"]<-obs.R4_Cd_w0$lambda[c(3,3,4,4)]

cxr_param_w0C[which(cxr_param_w0C$Replicate==5),"Tu_lambda"]<-obs.R5_Cd_w0$lambda[1:2]
cxr_param_w0C[which(cxr_param_w0C$Replicate==5),"Te_lambda"]<-obs.R5_Cd_w0$lambda[c(3,3,4,4)]


cxr_param_w0C[which(cxr_param_w0C$Replicate==1),"Tu_intra"]<-rep(c(obs.R1_Cd_w0$alpha_matrix[1,1], obs.R1_Cd_w0$alpha_matrix[2,2]), 2)
cxr_param_w0C[which(cxr_param_w0C$Replicate==1),"Te_intra"]<-rep(c(obs.R1_Cd_w0$alpha_matrix[3,3], obs.R1_Cd_w0$alpha_matrix[4,4]), each=2)

cxr_param_w0C[which(cxr_param_w0C$Replicate==2),"Tu_intra"]<-obs.R2_Cd_w0_sr1$alpha_intra
cxr_param_w0C[which(cxr_param_w0C$Replicate==2),"Te_intra"]<-c(obs.R2_Cd_w0_sr4$alpha_inter, obs.R2_Cd_w0_sr5$alpha_inter)

cxr_param_w0C[which(cxr_param_w0C$Replicate==3),"Tu_intra"]<-rep(c(obs.R3_Cd_w0$alpha_matrix[1,1], obs.R3_Cd_w0$alpha_matrix[2,2]), 2)
cxr_param_w0C[which(cxr_param_w0C$Replicate==3),"Te_intra"]<-rep(c(obs.R3_Cd_w0$alpha_matrix[3,3], obs.R3_Cd_w0$alpha_matrix[4,4]), each=2)

cxr_param_w0C[which(cxr_param_w0C$Replicate==4),"Tu_intra"]<-rep(c(obs.R4_Cd_w0$alpha_matrix[1,1], obs.R4_Cd_w0$alpha_matrix[2,2]), 2)
cxr_param_w0C[which(cxr_param_w0C$Replicate==4),"Te_intra"]<-rep(c(obs.R4_Cd_w0$alpha_matrix[3,3], obs.R4_Cd_w0$alpha_matrix[4,4]), each=2)

cxr_param_w0C[which(cxr_param_w0C$Replicate==5),"Tu_intra"]<-rep(c(obs.R5_Cd_w0$alpha_matrix[1,1], obs.R5_Cd_w0$alpha_matrix[2,2]), 2)
cxr_param_w0C[which(cxr_param_w0C$Replicate==5),"Te_intra"]<-rep(c(obs.R5_Cd_w0$alpha_matrix[3,3], obs.R5_Cd_w0$alpha_matrix[4,4]), each=2)


cxr_param_w0C[which(cxr_param_w0C$Replicate==1),"Tu_inter"]<-c(obs.R1_Cd_w0$alpha_matrix[1,3], obs.R1_Cd_w0$alpha_matrix[2,3],obs.R1_Cd_w0$alpha_matrix[1,4], obs.R1_Cd_w0$alpha_matrix[2,4])
cxr_param_w0C[which(cxr_param_w0C$Replicate==1),"Te_inter"]<-c(obs.R1_Cd_w0$alpha_matrix[3,1], obs.R1_Cd_w0$alpha_matrix[3,2],obs.R1_Cd_w0$alpha_matrix[4,1], obs.R1_Cd_w0$alpha_matrix[4,2])

cxr_param_w0C[which(cxr_param_w0C$Replicate==2),"Tu_inter"]<-obs.R2_Cd_w0_sr1$alpha_inter[2:3]
cxr_param_w0C[which(cxr_param_w0C$Replicate==2),"Te_inter"]<-c(obs.R2_Cd_w0_sr4_inter$alpha_inter,  obs.R2_Cd_w0_sr5_inter$alpha_inter)

cxr_param_w0C[which(cxr_param_w0C$Replicate==3),"Tu_inter"]<-c(obs.R3_Cd_w0$alpha_matrix[1,3], obs.R3_Cd_w0$alpha_matrix[2,3],obs.R3_Cd_w0$alpha_matrix[1,4], obs.R3_Cd_w0$alpha_matrix[2,4])
cxr_param_w0C[which(cxr_param_w0C$Replicate==3),"Te_inter"]<-c(obs.R3_Cd_w0$alpha_matrix[3,1], obs.R3_Cd_w0$alpha_matrix[3,2],obs.R3_Cd_w0$alpha_matrix[4,1], obs.R3_Cd_w0$alpha_matrix[4,2])

cxr_param_w0C[which(cxr_param_w0C$Replicate==4),"Tu_inter"]<-c(obs.R4_Cd_w0$alpha_matrix[1,3], obs.R4_Cd_w0$alpha_matrix[2,3],obs.R4_Cd_w0$alpha_matrix[1,4], obs.R4_Cd_w0$alpha_matrix[2,4])
cxr_param_w0C[which(cxr_param_w0C$Replicate==4),"Te_inter"]<-c(obs.R4_Cd_w0$alpha_matrix[3,1], obs.R4_Cd_w0$alpha_matrix[3,2],obs.R4_Cd_w0$alpha_matrix[4,1], obs.R4_Cd_w0$alpha_matrix[4,2])

cxr_param_w0C[which(cxr_param_w0C$Replicate==5),"Tu_inter"]<-c(obs.R5_Cd_w0$alpha_matrix[1,3], obs.R5_Cd_w0$alpha_matrix[2,3],obs.R5_Cd_w0$alpha_matrix[1,4], obs.R5_Cd_w0$alpha_matrix[2,4])
cxr_param_w0C[which(cxr_param_w0C$Replicate==5),"Te_inter"]<-c(obs.R5_Cd_w0$alpha_matrix[3,1], obs.R5_Cd_w0$alpha_matrix[3,2],obs.R5_Cd_w0$alpha_matrix[4,1], obs.R5_Cd_w0$alpha_matrix[4,2])


cxr_param_w0C

### Lower

cxr_param_w0C_lower<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("Cd"))
cxr_param_w0C_lower$Tu_lambda<-0
cxr_param_w0C_lower$Te_lambda<-0
cxr_param_w0C_lower$Tu_intra<-0
cxr_param_w0C_lower$Te_intra<-0
cxr_param_w0C_lower$Tu_inter<-0
cxr_param_w0C_lower$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_w0C_lower<-cxr_param_w0C_lower[-which(cxr_param_w0C_lower$Replicate==2 & cxr_param_w0C_lower$Tu_Regime=="SR2"),]


cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==1),"Tu_lambda"]<-rep(c(obs.R1_Cd_w0$lambda[1]-obs.R1_Cd_w0$lambda_standard_error[1], obs.R1_Cd_w0$lambda[2]-obs.R1_Cd_w0$lambda_standard_error[2]), 2)
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==1),"Te_lambda"]<-rep(c(obs.R1_Cd_w0$lambda[3]-obs.R1_Cd_w0$lambda_standard_error[3], obs.R1_Cd_w0$lambda[4]-obs.R1_Cd_w0$lambda_standard_error[4]), each=2)

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==2),"Tu_lambda"]<-c(obs.R2_Cd_w0_sr1$lambda-obs.R2_Cd_w0_sr1$lambda_standard_error)
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==2),"Te_lambda"]<-c(obs.R2_Cd_w0_sr4$lambda-obs.R2_Cd_w0_sr4$lambda_standard_error, obs.R2_Cd_w0_sr5$lambda-obs.R2_Cd_w0_sr5$lambda_standard_error)

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==3),"Tu_lambda"]<-rep(c(obs.R3_Cd_w0$lambda[1]-obs.R3_Cd_w0$lambda_standard_error[1], obs.R3_Cd_w0$lambda[2]-obs.R3_Cd_w0$lambda_standard_error[2]), 2)
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==3),"Te_lambda"]<-rep(c(obs.R3_Cd_w0$lambda[3]-obs.R3_Cd_w0$lambda_standard_error[3], obs.R3_Cd_w0$lambda[4]-obs.R3_Cd_w0$lambda_standard_error[4]), each=2)

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==4),"Tu_lambda"]<-rep(c(obs.R4_Cd_w0$lambda[1]-obs.R4_Cd_w0$lambda_standard_error[1], obs.R4_Cd_w0$lambda[2]-obs.R4_Cd_w0$lambda_standard_error[2]), 2)
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==4),"Te_lambda"]<-rep(c(obs.R4_Cd_w0$lambda[3]-obs.R4_Cd_w0$lambda_standard_error[3], obs.R4_Cd_w0$lambda[4]-obs.R4_Cd_w0$lambda_standard_error[4]), each=2)

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==5),"Tu_lambda"]<-rep(c(obs.R5_Cd_w0$lambda[1]-obs.R5_Cd_w0$lambda_standard_error[1], obs.R5_Cd_w0$lambda[2]-obs.R5_Cd_w0$lambda_standard_error[2]), 2)
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==5),"Te_lambda"]<-rep(c(obs.R5_Cd_w0$lambda[3]-obs.R5_Cd_w0$lambda_standard_error[3], obs.R5_Cd_w0$lambda[4]-obs.R5_Cd_w0$lambda_standard_error[4]), each=2)


cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==1),"Tu_intra"]<-rep(c(obs.R1_Cd_w0$alpha_matrix[1,1]-obs.R1_Cd_w0$alpha_matrix_standard_error[1,1], obs.R1_Cd_w0$alpha_matrix[2,2]-obs.R1_Cd_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==1),"Te_intra"]<-rep(c(obs.R1_Cd_w0$alpha_matrix[3,3]-obs.R1_Cd_w0$alpha_matrix_standard_error[3,3], obs.R1_Cd_w0$alpha_matrix[4,4]-obs.R1_Cd_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==2),"Tu_intra"]<-obs.R2_Cd_w0_sr1$alpha_intra-obs.R2_Cd_w0_sr1$alpha_intra_standard_error
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==2),"Te_intra"]<-c(obs.R2_Cd_w0_sr4$alpha_inter-obs.R2_Cd_w0_sr4$alpha_inter_standard_error, obs.R2_Cd_w0_sr5$alpha_inter-obs.R2_Cd_w0_sr5$alpha_inter_standard_error)

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==3),"Tu_intra"]<-rep(c(obs.R3_Cd_w0$alpha_matrix[1,1]-obs.R3_Cd_w0$alpha_matrix_standard_error[1,1], obs.R3_Cd_w0$alpha_matrix[2,2]-obs.R3_Cd_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==3),"Te_intra"]<-rep(c(obs.R3_Cd_w0$alpha_matrix[3,3]-obs.R3_Cd_w0$alpha_matrix_standard_error[3,3], obs.R3_Cd_w0$alpha_matrix[4,4]-obs.R3_Cd_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==4),"Tu_intra"]<-rep(c(obs.R4_Cd_w0$alpha_matrix[1,1]-obs.R4_Cd_w0$alpha_matrix_standard_error[1,1], obs.R4_Cd_w0$alpha_matrix[2,2]-obs.R4_Cd_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==4),"Te_intra"]<-rep(c(obs.R4_Cd_w0$alpha_matrix[3,3]-obs.R4_Cd_w0$alpha_matrix_standard_error[3,3], obs.R4_Cd_w0$alpha_matrix[4,4]-obs.R4_Cd_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==5),"Tu_intra"]<-rep(c(obs.R5_Cd_w0$alpha_matrix[1,1]-obs.R5_Cd_w0$alpha_matrix_standard_error[1,1], obs.R5_Cd_w0$alpha_matrix[2,2]-obs.R5_Cd_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==5),"Te_intra"]<-rep(c(obs.R5_Cd_w0$alpha_matrix[3,3]-obs.R5_Cd_w0$alpha_matrix_standard_error[3,3], obs.R5_Cd_w0$alpha_matrix[4,4]-obs.R5_Cd_w0$alpha_matrix_standard_error[4,4]), each=2)


cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==1),"Tu_inter"]<-c(obs.R1_Cd_w0$alpha_matrix[1,3]-obs.R1_Cd_w0$alpha_matrix_standard_error[1,3], obs.R1_Cd_w0$alpha_matrix[2,3]-obs.R1_Cd_w0$alpha_matrix_standard_error[2,3],obs.R1_Cd_w0$alpha_matrix[1,4]-obs.R1_Cd_w0$alpha_matrix_standard_error[1,4], obs.R1_Cd_w0$alpha_matrix[2,4]-obs.R1_Cd_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==1),"Te_inter"]<-c(obs.R1_Cd_w0$alpha_matrix[3,1]-obs.R1_Cd_w0$alpha_matrix_standard_error[3,1], obs.R1_Cd_w0$alpha_matrix[3,2]-obs.R1_Cd_w0$alpha_matrix_standard_error[3,2],obs.R1_Cd_w0$alpha_matrix[4,1]-obs.R1_Cd_w0$alpha_matrix_standard_error[4,1], obs.R1_Cd_w0$alpha_matrix[4,2]-obs.R1_Cd_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==2),"Tu_inter"]<-obs.R2_Cd_w0_sr1$alpha_inter[2:3]-obs.R2_Cd_w0_sr1$alpha_inter_standard_error[2:3]
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==2),"Te_inter"]<-c(obs.R2_Cd_w0_sr4_inter$alpha_inter-obs.R2_Cd_w0_sr4_inter$alpha_inter_standard_error, obs.R2_Cd_w0_sr5_inter$alpha_inter-obs.R2_Cd_w0_sr5_inter$alpha_inter_standard_error)

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==3),"Tu_inter"]<-c(obs.R3_Cd_w0$alpha_matrix[1,3]-obs.R3_Cd_w0$alpha_matrix_standard_error[1,3], obs.R3_Cd_w0$alpha_matrix[2,3]-obs.R3_Cd_w0$alpha_matrix_standard_error[2,3],obs.R3_Cd_w0$alpha_matrix[1,4]-obs.R3_Cd_w0$alpha_matrix_standard_error[1,4], obs.R3_Cd_w0$alpha_matrix[2,4]-obs.R3_Cd_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==3),"Te_inter"]<-c(obs.R3_Cd_w0$alpha_matrix[3,1]-obs.R3_Cd_w0$alpha_matrix_standard_error[3,1], obs.R3_Cd_w0$alpha_matrix[3,2]-obs.R3_Cd_w0$alpha_matrix_standard_error[3,2],obs.R3_Cd_w0$alpha_matrix[4,1]-obs.R3_Cd_w0$alpha_matrix_standard_error[4,1], obs.R3_Cd_w0$alpha_matrix[4,2]-obs.R3_Cd_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==4),"Tu_inter"]<-c(obs.R4_Cd_w0$alpha_matrix[1,3]-obs.R4_Cd_w0$alpha_matrix_standard_error[1,3], obs.R4_Cd_w0$alpha_matrix[2,3]-obs.R4_Cd_w0$alpha_matrix_standard_error[2,3],obs.R4_Cd_w0$alpha_matrix[1,4]-obs.R4_Cd_w0$alpha_matrix_standard_error[1,4], obs.R4_Cd_w0$alpha_matrix[2,4]-obs.R4_Cd_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==4),"Te_inter"]<-c(obs.R4_Cd_w0$alpha_matrix[3,1]-obs.R4_Cd_w0$alpha_matrix_standard_error[3,1], obs.R4_Cd_w0$alpha_matrix[3,2]-obs.R4_Cd_w0$alpha_matrix_standard_error[3,2],obs.R4_Cd_w0$alpha_matrix[4,1]-obs.R4_Cd_w0$alpha_matrix_standard_error[4,1], obs.R4_Cd_w0$alpha_matrix[4,2]-obs.R4_Cd_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==5),"Tu_inter"]<-c(obs.R5_Cd_w0$alpha_matrix[1,3]-obs.R5_Cd_w0$alpha_matrix_standard_error[1,3], obs.R5_Cd_w0$alpha_matrix[2,3]-obs.R5_Cd_w0$alpha_matrix_standard_error[2,3],obs.R5_Cd_w0$alpha_matrix[1,4]-obs.R5_Cd_w0$alpha_matrix_standard_error[1,4], obs.R5_Cd_w0$alpha_matrix[2,4]-obs.R5_Cd_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0C_lower[which(cxr_param_w0C_lower$Replicate==5),"Te_inter"]<-c(obs.R5_Cd_w0$alpha_matrix[3,1]-obs.R5_Cd_w0$alpha_matrix_standard_error[3,1], obs.R5_Cd_w0$alpha_matrix[3,2]-obs.R5_Cd_w0$alpha_matrix_standard_error[3,2],obs.R5_Cd_w0$alpha_matrix[4,1]-obs.R5_Cd_w0$alpha_matrix_standard_error[4,1], obs.R5_Cd_w0$alpha_matrix[4,2]-obs.R5_Cd_w0$alpha_matrix_standard_error[4,2])

### upper

cxr_param_w0C_upper<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("Cd"))
cxr_param_w0C_upper$Tu_lambda<-0
cxr_param_w0C_upper$Te_lambda<-0
cxr_param_w0C_upper$Tu_intra<-0
cxr_param_w0C_upper$Te_intra<-0
cxr_param_w0C_upper$Tu_inter<-0
cxr_param_w0C_upper$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_w0C_upper<-cxr_param_w0C_upper[-which(cxr_param_w0C_upper$Replicate==2 & cxr_param_w0C_upper$Tu_Regime=="SR2"),]


cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==1),"Tu_lambda"]<-rep(c(obs.R1_Cd_w0$lambda[1]+obs.R1_Cd_w0$lambda_standard_error[1], obs.R1_Cd_w0$lambda[2]+obs.R1_Cd_w0$lambda_standard_error[2]), 2)
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==1),"Te_lambda"]<-rep(c(obs.R1_Cd_w0$lambda[3]+obs.R1_Cd_w0$lambda_standard_error[3], obs.R1_Cd_w0$lambda[4]+obs.R1_Cd_w0$lambda_standard_error[4]), each=2)

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==2),"Tu_lambda"]<-c(obs.R2_Cd_w0_sr1$lambda+obs.R2_Cd_w0_sr1$lambda_standard_error)
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==2),"Te_lambda"]<-c(obs.R2_Cd_w0_sr4$lambda+obs.R2_Cd_w0_sr4$lambda_standard_error, obs.R2_Cd_w0_sr5$lambda+obs.R2_Cd_w0_sr5$lambda_standard_error)

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==3),"Tu_lambda"]<-rep(c(obs.R3_Cd_w0$lambda[1]+obs.R3_Cd_w0$lambda_standard_error[1], obs.R3_Cd_w0$lambda[2]+obs.R3_Cd_w0$lambda_standard_error[2]), 2)
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==3),"Te_lambda"]<-rep(c(obs.R3_Cd_w0$lambda[3]+obs.R3_Cd_w0$lambda_standard_error[3], obs.R3_Cd_w0$lambda[4]+obs.R3_Cd_w0$lambda_standard_error[4]), each=2)

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==4),"Tu_lambda"]<-rep(c(obs.R4_Cd_w0$lambda[1]+obs.R4_Cd_w0$lambda_standard_error[1], obs.R4_Cd_w0$lambda[2]+obs.R4_Cd_w0$lambda_standard_error[2]), 2)
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==4),"Te_lambda"]<-rep(c(obs.R4_Cd_w0$lambda[3]+obs.R4_Cd_w0$lambda_standard_error[3], obs.R4_Cd_w0$lambda[4]+obs.R4_Cd_w0$lambda_standard_error[4]), each=2)

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==5),"Tu_lambda"]<-rep(c(obs.R5_Cd_w0$lambda[1]+obs.R5_Cd_w0$lambda_standard_error[1], obs.R5_Cd_w0$lambda[2]+obs.R5_Cd_w0$lambda_standard_error[2]), 2)
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==5),"Te_lambda"]<-rep(c(obs.R5_Cd_w0$lambda[3]+obs.R5_Cd_w0$lambda_standard_error[3], obs.R5_Cd_w0$lambda[4]+obs.R5_Cd_w0$lambda_standard_error[4]), each=2)


cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==1),"Tu_intra"]<-rep(c(obs.R1_Cd_w0$alpha_matrix[1,1]+obs.R1_Cd_w0$alpha_matrix_standard_error[1,1], obs.R1_Cd_w0$alpha_matrix[2,2]+obs.R1_Cd_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==1),"Te_intra"]<-rep(c(obs.R1_Cd_w0$alpha_matrix[3,3]+obs.R1_Cd_w0$alpha_matrix_standard_error[3,3], obs.R1_Cd_w0$alpha_matrix[4,4]+obs.R1_Cd_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==2),"Tu_intra"]<-obs.R2_Cd_w0_sr1$alpha_intra + obs.R2_Cd_w0_sr1$alpha_intra_standard_error
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==2),"Te_intra"]<-c(obs.R2_Cd_w0_sr4$alpha_inter+obs.R2_Cd_w0_sr4$alpha_inter_standard_error, obs.R2_Cd_w0_sr5$alpha_inter+obs.R2_Cd_w0_sr5$alpha_inter_standard_error)


cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==3),"Tu_intra"]<-rep(c(obs.R3_Cd_w0$alpha_matrix[1,1]+obs.R3_Cd_w0$alpha_matrix_standard_error[1,1], obs.R3_Cd_w0$alpha_matrix[2,2]+obs.R3_Cd_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==3),"Te_intra"]<-rep(c(obs.R3_Cd_w0$alpha_matrix[3,3]+obs.R3_Cd_w0$alpha_matrix_standard_error[3,3], obs.R3_Cd_w0$alpha_matrix[4,4]+obs.R3_Cd_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==4),"Tu_intra"]<-rep(c(obs.R4_Cd_w0$alpha_matrix[1,1]+obs.R4_Cd_w0$alpha_matrix_standard_error[1,1], obs.R4_Cd_w0$alpha_matrix[2,2]+obs.R4_Cd_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==4),"Te_intra"]<-rep(c(obs.R4_Cd_w0$alpha_matrix[3,3]+obs.R4_Cd_w0$alpha_matrix_standard_error[3,3], obs.R4_Cd_w0$alpha_matrix[4,4]+obs.R4_Cd_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==5),"Tu_intra"]<-rep(c(obs.R5_Cd_w0$alpha_matrix[1,1]+obs.R5_Cd_w0$alpha_matrix_standard_error[1,1], obs.R5_Cd_w0$alpha_matrix[2,2]+obs.R5_Cd_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==5),"Te_intra"]<-rep(c(obs.R5_Cd_w0$alpha_matrix[3,3]+obs.R5_Cd_w0$alpha_matrix_standard_error[3,3], obs.R5_Cd_w0$alpha_matrix[4,4]+obs.R5_Cd_w0$alpha_matrix_standard_error[4,4]), each=2)


cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==1),"Tu_inter"]<-c(obs.R1_Cd_w0$alpha_matrix[1,3]+obs.R1_Cd_w0$alpha_matrix_standard_error[1,3], obs.R1_Cd_w0$alpha_matrix[2,3]+obs.R1_Cd_w0$alpha_matrix_standard_error[2,3],obs.R1_Cd_w0$alpha_matrix[1,4]+obs.R1_Cd_w0$alpha_matrix_standard_error[1,4], obs.R1_Cd_w0$alpha_matrix[2,4]+obs.R1_Cd_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==1),"Te_inter"]<-c(obs.R1_Cd_w0$alpha_matrix[3,1]+obs.R1_Cd_w0$alpha_matrix_standard_error[3,1], obs.R1_Cd_w0$alpha_matrix[3,2]+obs.R1_Cd_w0$alpha_matrix_standard_error[3,2],obs.R1_Cd_w0$alpha_matrix[4,1]+obs.R1_Cd_w0$alpha_matrix_standard_error[4,1], obs.R1_Cd_w0$alpha_matrix[4,2]+obs.R1_Cd_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==2),"Tu_inter"]<-obs.R2_Cd_w0_sr1$alpha_inter[2:3]+obs.R2_Cd_w0_sr1$alpha_inter_standard_error[2:3]
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==2),"Te_inter"]<-c(obs.R2_Cd_w0_sr4_inter$alpha_inter+obs.R2_Cd_w0_sr4_inter$alpha_inter_standard_error, obs.R2_Cd_w0_sr5_inter$alpha_inter+obs.R2_Cd_w0_sr5_inter$alpha_inter_standard_error)

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==3),"Tu_inter"]<-c(obs.R3_Cd_w0$alpha_matrix[1,3]+obs.R3_Cd_w0$alpha_matrix_standard_error[1,3], obs.R3_Cd_w0$alpha_matrix[2,3]+obs.R3_Cd_w0$alpha_matrix_standard_error[2,3],obs.R3_Cd_w0$alpha_matrix[1,4]+obs.R3_Cd_w0$alpha_matrix_standard_error[1,4], obs.R3_Cd_w0$alpha_matrix[2,4]+obs.R3_Cd_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==3),"Te_inter"]<-c(obs.R3_Cd_w0$alpha_matrix[3,1]+obs.R3_Cd_w0$alpha_matrix_standard_error[3,1], obs.R3_Cd_w0$alpha_matrix[3,2]+obs.R3_Cd_w0$alpha_matrix_standard_error[3,2],obs.R3_Cd_w0$alpha_matrix[4,1]+obs.R3_Cd_w0$alpha_matrix_standard_error[4,1], obs.R3_Cd_w0$alpha_matrix[4,2]+obs.R3_Cd_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==4),"Tu_inter"]<-c(obs.R4_Cd_w0$alpha_matrix[1,3]+obs.R4_Cd_w0$alpha_matrix_standard_error[1,3], obs.R4_Cd_w0$alpha_matrix[2,3]+obs.R4_Cd_w0$alpha_matrix_standard_error[2,3],obs.R4_Cd_w0$alpha_matrix[1,4]+obs.R4_Cd_w0$alpha_matrix_standard_error[1,4], obs.R4_Cd_w0$alpha_matrix[2,4]+obs.R4_Cd_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==4),"Te_inter"]<-c(obs.R4_Cd_w0$alpha_matrix[3,1]+obs.R4_Cd_w0$alpha_matrix_standard_error[3,1], obs.R4_Cd_w0$alpha_matrix[3,2]+obs.R4_Cd_w0$alpha_matrix_standard_error[3,2],obs.R4_Cd_w0$alpha_matrix[4,1]+obs.R4_Cd_w0$alpha_matrix_standard_error[4,1], obs.R4_Cd_w0$alpha_matrix[4,2]+obs.R4_Cd_w0$alpha_matrix_standard_error[4,2])

cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==5),"Tu_inter"]<-c(obs.R5_Cd_w0$alpha_matrix[1,3]+obs.R5_Cd_w0$alpha_matrix_standard_error[1,3], obs.R5_Cd_w0$alpha_matrix[2,3]+obs.R5_Cd_w0$alpha_matrix_standard_error[2,3],obs.R5_Cd_w0$alpha_matrix[1,4]+obs.R5_Cd_w0$alpha_matrix_standard_error[1,4], obs.R5_Cd_w0$alpha_matrix[2,4]+obs.R5_Cd_w0$alpha_matrix_standard_error[2,4])
cxr_param_w0C_upper[which(cxr_param_w0C_upper$Replicate==5),"Te_inter"]<-c(obs.R5_Cd_w0$alpha_matrix[3,1]+obs.R5_Cd_w0$alpha_matrix_standard_error[3,1], obs.R5_Cd_w0$alpha_matrix[3,2]+obs.R5_Cd_w0$alpha_matrix_standard_error[3,2],obs.R5_Cd_w0$alpha_matrix[4,1]+obs.R5_Cd_w0$alpha_matrix_standard_error[4,1], obs.R5_Cd_w0$alpha_matrix[4,2]+obs.R5_Cd_w0$alpha_matrix_standard_error[4,2])
joining data frame
param_all_w0<-as.data.frame(rbind(cxr_param_w0, cxr_param_w0C))

param_all_w0_lower<-as.data.frame(rbind(cxr_param_w0_lower, cxr_param_w0C_lower))
param_all_w0_upper<-as.data.frame(rbind(cxr_param_w0_upper, cxr_param_w0C_upper))


param_all_w0_lower
param_all_w0_upper

write.csv(param_all_w0, "./NewAnalyses/cxr_normal/parameters_cxr_normal.csv")
write.csv(param_all_w0_upper, "./NewAnalyses/cxr_normal/parameters_cxr_normal_upper.csv")
write.csv(param_all_w0_lower, "./NewAnalyses/cxr_normal/parameters_cxr_normal_lower.csv")

Importing parameters

param_all_w0<-read.csv("./NewAnalyses/cxr_normal/parameters_cxr_normal.csv")
param_all_w0_upper<-read.csv("./NewAnalyses/cxr_normal/parameters_cxr_normal_upper.csv")
param_all_w0_lower<-read.csv("./NewAnalyses/cxr_normal/parameters_cxr_normal_lower.csv")

param_all_w0<-param_all_w0[,-1]
param_all_w0_upper<-param_all_w0_upper[,-1]
param_all_w0_lower<-param_all_w0_lower[,-1]

str(param_all_w0)
'data.frame':   36 obs. of  10 variables:
 $ Tu_Regime  : chr  "SR1" "SR2" "SR1" "SR2" ...
 $ Te_Regime  : chr  "SR4" "SR4" "SR5" "SR5" ...
 $ Replicate  : int  1 1 1 1 2 2 3 3 3 3 ...
 $ Environment: chr  "N" "N" "N" "N" ...
 $ Tu_lambda  : num  2.79 2.07 2.79 2.07 2.05 ...
 $ Te_lambda  : num  4.84 4.84 5.07 5.07 5.12 ...
 $ Tu_intra   : num  0.06227 -0.00636 0.06227 -0.00636 -0.00608 ...
 $ Te_intra   : num  0.0213 0.0213 0.0259 0.0259 -0.0236 ...
 $ Tu_inter   : num  0.0211 0.0165 0.0406 0.0166 -0.0224 ...
 $ Te_inter   : num  0.0851 0.0548 0.0432 0.1002 0.1675 ...
str(param_all_w0_upper)
'data.frame':   36 obs. of  10 variables:
 $ Tu_Regime  : chr  "SR1" "SR2" "SR1" "SR2" ...
 $ Te_Regime  : chr  "SR4" "SR4" "SR5" "SR5" ...
 $ Replicate  : int  1 1 1 1 2 2 3 3 3 3 ...
 $ Environment: chr  "N" "N" "N" "N" ...
 $ Tu_lambda  : num  3.18 2.35 3.18 2.35 2.32 ...
 $ Te_lambda  : num  5.84 5.84 6.07 6.07 6.76 ...
 $ Tu_intra   : num  0.0857 0.016 0.0857 0.016 0.0223 ...
 $ Te_intra   : num  0.062 0.062 0.0631 0.0631 0.0246 ...
 $ Tu_inter   : num  0.05931 0.04554 0.06747 0.0462 0.00534 ...
 $ Te_inter   : num  0.1309 0.0928 0.0879 0.1446 0.3441 ...
str(param_all_w0_lower)
'data.frame':   36 obs. of  10 variables:
 $ Tu_Regime  : chr  "SR1" "SR2" "SR1" "SR2" ...
 $ Te_Regime  : chr  "SR4" "SR4" "SR5" "SR5" ...
 $ Replicate  : int  1 1 1 1 2 2 3 3 3 3 ...
 $ Environment: chr  "N" "N" "N" "N" ...
 $ Tu_lambda  : num  2.4 1.8 2.4 1.8 1.79 ...
 $ Te_lambda  : num  3.85 3.85 4.07 4.07 3.48 ...
 $ Tu_intra   : num  0.0388 -0.0287 0.0388 -0.0287 -0.0345 ...
 $ Te_intra   : num  -0.0194 -0.0194 -0.0113 -0.0113 -0.0718 ...
 $ Tu_inter   : num  -0.0171 -0.0126 0.0137 -0.0129 -0.0501 ...
 $ Te_inter   : num  0.03931 0.01684 -0.00151 0.05585 -0.00903 ...
Plotting data

param_all_w0_long<-gather(param_all_w0, parameter, value,Tu_lambda:Te_inter )

param_all_w0_long$category<-mapvalues(param_all_w0_long$parameter, c("Tu_lambda", "Te_lambda", "Tu_intra", "Te_intra","Tu_inter", "Te_inter"), c("lambda", "lambda", "intra", "intra", "inter", "inter"))

param_all_w0_lower_long<-gather(param_all_w0_lower, parameter, value,Tu_lambda:Te_inter )

param_all_w0_lower_long$category<-mapvalues(param_all_w0_lower_long$parameter, c("Tu_lambda", "Te_lambda", "Tu_intra", "Te_intra","Tu_inter", "Te_inter"), c("lambda", "lambda", "intra", "intra", "inter", "inter"))

param_all_w0_upper_long<-gather(param_all_w0_upper, parameter, value,Tu_lambda:Te_inter )

param_all_w0_upper_long$category<-mapvalues(param_all_w0_upper_long$parameter, c("Tu_lambda", "Te_lambda", "Tu_intra", "Te_intra","Tu_inter", "Te_inter"), c("lambda", "lambda", "intra", "intra", "inter", "inter"))

colnames(param_all_w0_lower_long)[6]<-"lower"
colnames(param_all_w0_upper_long)[6]<-"upper"

str(param_all_w0_long)
'data.frame':   216 obs. of  7 variables:
 $ Tu_Regime  : chr  "SR1" "SR2" "SR1" "SR2" ...
 $ Te_Regime  : chr  "SR4" "SR4" "SR5" "SR5" ...
 $ Replicate  : int  1 1 1 1 2 2 3 3 3 3 ...
 $ Environment: chr  "N" "N" "N" "N" ...
 $ parameter  : chr  "Tu_lambda" "Tu_lambda" "Tu_lambda" "Tu_lambda" ...
 $ value      : num  2.79 2.07 2.79 2.07 2.05 ...
 $ category   : chr  "lambda" "lambda" "lambda" "lambda" ...
param_all_w0_long<-cbind(param_all_w0_long[,1:7],param_all_w0_lower_long$lower, param_all_w0_upper_long$upper)

colnames(param_all_w0_long)[8:9]<-c("lower","upper")


ggplot(subset(param_all_w0_long, parameter=="Te_intra" & Tu_Regime=="SR1"), aes(x=Te_Regime, y=value, fill=Environment))+
  geom_boxplot( position=position_dodge2(0.5), outlier.alpha = 99)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("Evolved \nwithout cadmium", "Evolved \nwith cadmium"))+
  scale_fill_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  scale_colour_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Selection regime")
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTe_w0_rep.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_intra" & Te_Regime=="SR4"), aes(x=Tu_Regime, y=value, fill=Environment))+
  geom_boxplot(position=position_dodge2(0.5), outlier.alpha = 99)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("Evolved \nwithout cadmium", "Evolved \nwith cadmium"))+
  scale_fill_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  scale_colour_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Selection regime")
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTu_w0_rep.pdf", width=20, height=15)




ggplot(subset(param_all_w0_long, parameter=="Te_intra" & Tu_Regime=="SR1" & Environment=="Cd"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot(position=position_dodge2(0.5), outlier.alpha = 99)+
  geom_point(alpha=0.85, position=position_dodge2(0.5))+
  theme_ines+
  scale_fill_manual(values=c("#D55E00", "#009E73"))+
  scale_x_discrete(labels=c("Evolved \nwithout cadmium", "Evolved \nwith cadmium"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Selection regime")
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTe_w0_rep_evol.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_intra" & Te_Regime=="SR4" & Environment=="Cd"), aes(x=Tu_Regime, y=value, fill=Tu_Regime))+
  geom_boxplot( position=position_dodge2(0.5), outlier.alpha = 99)+
  geom_point(alpha=0.85, position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("Evolved \nwithout cadmium", "Evolved \nwith cadmium"))+
  scale_fill_manual(values=c("#D55E00", "#009E73"))+
  scale_colour_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Selection regime")
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTu_w0_rep_evol.pdf", width=20, height=15)



ggplot(subset(param_all_w0_long, parameter=="Te_intra" & Tu_Regime=="SR1"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTe_w0_rep_env.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_intra" & Te_Regime=="SR4"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Homogeneous"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Homogeneous"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTu_w0_rep_env.pdf", width=20, height=15)



ggplot(subset(param_all_w0_long, parameter=="Te_inter"), aes(x=Environment, y=value, fill=Te_Regime))+
  facet_grid(Tu_Regime~., labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_normal/param_RK_interTe_w0_rep_env.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_inter"), aes(fill=Tu_Regime, y=value, x=Environment))+
  facet_grid(Te_Regime~., labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Homogeneous"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Homogeneous"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_normal/param_RK_interTu_w0_rep_env.pdf", width=20, height=15)



ggplot(subset(param_all_w0_long, parameter=="Te_lambda" & Tu_Regime=="SR1"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( position=position_dodge2(0.5), outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  ylab("Intrinsic growth rate (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_normal/param_RK_lambdaTe_w0_rep_env.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_lambda" & Te_Regime=="SR4"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot(position=position_dodge2(0.5), outlier.alpha =0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Homogeneous"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Homogeneous"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_normal/param_RK_lambdaTu_w0_rep_env.pdf", width=20, height=15)



###########


ggplot(subset(param_all_w0_long, parameter=="Te_intra" & Tu_Regime=="SR1" & Environment=="Cd"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")+
  ylim(c(0.03,0.27))
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTe_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Te_intra" & Tu_Regime=="SR1" & Environment=="N"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")+
  ylim(c(0.03,0.27))
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_intra" & Te_Regime=="SR4" & Environment=="Cd"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")+
  ylim(c(0.03,0.27))
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTu_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_intra" & Te_Regime=="SR4" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")+
  ylim(c(0.03,0.27))
save_plot("./NewAnalyses/cxr_normal/param_RK_intraTu_w0_rep_N.pdf", width=20, height=15)



ggplot(subset(param_all_w0_long, parameter=="Te_inter" & Environment=="Cd"), aes(x=Environment, y=value, fill=Te_Regime))+
  facet_grid(.~Tu_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Environment")+
  ylim(c(-0.05, 0.16))
save_plot("./NewAnalyses/cxr_normal/param_RK_interTe_w0_rep_Cd.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Te_inter" & Environment=="N"), aes(x=Environment, y=value, fill=Te_Regime))+
  facet_grid(.~Tu_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Environment")+
  ylim(c(-0.05, 0.16))
save_plot("./NewAnalyses/cxr_normal/param_RK_interTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_inter" & Environment=="Cd"), aes(fill=Tu_Regime, y=value, x=Environment))+
  facet_grid(.~Te_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Environment")+
  ylim(c(-0.05, 0.12))
save_plot("./NewAnalyses/cxr_normal/param_RK_interTu_w0_rep_Cd.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_inter" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Environment))+
  facet_grid(.~Te_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Environment")+
  ylim(c(-0.05, 0.12))
save_plot("./NewAnalyses/cxr_normal/param_RK_interTu_w0_rep_N.pdf", width=20, height=15)



ggplot(subset(param_all_w0_long, parameter=="Te_lambda" & Tu_Regime=="SR1" & Environment=="Cd"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. evansi)")+
  xlab("Environment")+
  ylim(c(0, 3))
save_plot("./NewAnalyses/cxr_normal/param_RK_lambdaTe_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Te_lambda" & Tu_Regime=="SR1" & Environment=="N"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. evansi)")+
  xlab("Environment")+
  ylim(c(0, 8))
save_plot("./NewAnalyses/cxr_normal/param_RK_lambdaTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_lambda" & Te_Regime=="SR4" & Environment=="Cd"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c( "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Environment")+
  ylim(c(0, 3))
save_plot("./NewAnalyses/cxr_normal/param_RK_lambdaTu_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(param_all_w0_long, parameter=="Tu_lambda" & Te_Regime=="SR4" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Environment")+
  ylim(c(0, 8))
save_plot("./NewAnalyses/cxr_normal/param_RK_lambdaTu_w0_rep_N.pdf", width=20, height=15)

NA
NA

Predicting densities


density_aux<-seq(0, 10, by=(10/100))

pred_df_cxr<-as.data.frame(expand_grid(Density=density_aux, Tu_Regime=c("SR1","SR2"), Te_Regime=c("SR4","SR5"), Replicate=c(1:5), Environment=c("N", "Cd")))

pred_df_cxr$Tu_mean_intra<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Tu_mean_inter<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr$Density[x])
    
    pred
})


pred_df_cxr$Tu_intra_L<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Tu_inter_L<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Tu_intra_U<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Tu_inter_U<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Te_mean_intra<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Te_mean_inter<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_w0, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Te_intra_L<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Te_inter_L<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_w0_lower, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Te_intra_U<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr$Density[x])
    
    pred
})

pred_df_cxr$Te_inter_U<-sapply(c(1:length(pred_df_cxr[,1])), function(x){
   alpha_i<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Tu_Regime==pred_df_cxr$Tu_Regime[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_w0_upper, Environment==pred_df_cxr$Environment[x] & Te_Regime==pred_df_cxr$Te_Regime[x] & Replicate==pred_df_cxr$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr$Density[x])
    
    pred
})

# Removing Tu evolved replicate 2 because there is no data
pred_df_cxr<-pred_df_cxr[-which(pred_df_cxr$Tu_Regime=="SR2" & pred_df_cxr$Replicate==2),]



# Transforming everything bellow 0 into 0 for the lower interval

pred_df_cxr$Te_inter_L[which(pred_df_cxr$Te_inter_L<0)]<-0
pred_df_cxr$Te_intra_L[which(pred_df_cxr$Te_intra_L<0)]<-0
pred_df_cxr$Tu_inter_L[which(pred_df_cxr$Tu_inter_L<0)]<-0
pred_df_cxr$Tu_intra_L[which(pred_df_cxr$Tu_intra_L<0)]<-0
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific control environment")

Plotting predictions

CONTROL INTRA
ca$Replicate<-as.character(ca$Rep)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific control environment")
save_plot("./NewAnalyses/cxr_normal/pred_Tu_INTRA_Control_water.pdf", width=25, height=10)


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="C" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="C" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific cadmium environment")
save_plot("./NewAnalyses/cxr_normal/pred_Tu_INTRA_Control_cadmium.pdf", width=25, height=10)


#subset(pred_df_cxr, Tu_Regime==1 & Environment=="C" & Replicate==3)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="N" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="N" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific control environment")
save_plot("./NewAnalyses/cxr_normal/pred_Te_INTRA_Control_control.pdf", width=25, height=10)

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="C" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="C" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific cadmium environment")
save_plot("./NewAnalyses/cxr_normal/pred_Te_INTRA_Control_cadmium.pdf", width=25, height=10)

CONTROL INTER vs control
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="N" & Te_Regime==4), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="N" & Te_Regime==4), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu & Te control interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="C" & Te_Regime==4), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="C" & Te_Regime==4), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu & Te control interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="N" & Tu_Regime==1), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="N" & Tu_Regime==1), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te  & Tu control intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="C" & Tu_Regime==1), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="C" & Tu_Regime==1), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te & Tu control interspecific cadmium environment")

CONTROL INTER vs evolved
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="N" & Te_Regime==5), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="N" & Te_Regime==5), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu control & Te evolved interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="C" & Te_Regime==5), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==1 & Environment=="C" & Te_Regime==5), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu control & Te evolved interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="N" & Tu_Regime==2), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="N" & Tu_Regime==2), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te control  & Tu evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="C" & Tu_Regime==2), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==4 & Environment=="C" & Tu_Regime==2), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te control  & Tu evolved interspecific cadmium environment")

CONTROL INTRA evolved
ca$Replicate<-as.character(ca$Rep)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved intraspecific control environment")


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="C" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="C" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved intraspecific cadmium environment")


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="N" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="N" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="C" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="C" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved intraspecific cadmium environment")

Evolved INTER vs control
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="N" & Te_Regime==4), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="N" & Te_Regime==4), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te control interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="C" & Te_Regime==4), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="C" & Te_Regime==4), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te control interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="N" & Tu_Regime==1), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="N" & Tu_Regime==1), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu control intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="C" & Tu_Regime==1), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="C" & Tu_Regime==1), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved & Tu control interspecific cadmium environment")

evolved INTER vs evolved
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="N" & Te_Regime==5), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="N" & Te_Regime==5), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te evolved interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="C" & Te_Regime==5), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Tu_Regime==2 & Environment=="C" & Te_Regime==5), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te evolved interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="N" & Tu_Regime==2), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="N" & Tu_Regime==2), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="C" & Tu_Regime==2), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr, Te_Regime==5 & Environment=="C" & Tu_Regime==2), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu evolved interspecific cadmium environment")

Predicted vs observed

str(param_all_w0)
'data.frame':   36 obs. of  10 variables:
 $ Tu_Regime  : chr  "SR1" "SR2" "SR1" "SR2" ...
 $ Te_Regime  : chr  "SR4" "SR4" "SR5" "SR5" ...
 $ Replicate  : int  1 1 1 1 2 2 3 3 3 3 ...
 $ Environment: chr  "N" "N" "N" "N" ...
 $ Tu_lambda  : num  2.79 2.07 2.79 2.07 2.05 ...
 $ Te_lambda  : num  4.84 4.84 5.07 5.07 5.12 ...
 $ Tu_intra   : num  0.06227 -0.00636 0.06227 -0.00636 -0.00608 ...
 $ Te_intra   : num  0.0213 0.0213 0.0259 0.0259 -0.0236 ...
 $ Tu_inter   : num  0.0211 0.0165 0.0406 0.0166 -0.0224 ...
 $ Te_inter   : num  0.0851 0.0548 0.0432 0.1002 0.1675 ...
str(ca)
'data.frame':   3451 obs. of  42 variables:
 $ Block                       : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Rep                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Box                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Leaf                        : int  3 4 3 4 3 4 3 4 3 4 ...
 $ Disk                        : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Env                         : chr  "N" "N" "Cd" "Cd" ...
 $ FocalSR                     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR                      : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens                        : int  1 1 1 1 2 2 2 2 4 4 ...
 $ Type                        : chr  "INTRA" "INTRA" "INTRA" "INTRA" ...
 $ Focalfemale                 : chr  "Te" "Te" "Te" "Te" ...
 $ FocalDead                   : int  0 0 1 0 1 1 0 0 0 0 ...
 $ FocalDrowned                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ FocalMissing                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumbDeadComp                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumberOfEggs                : int  11 21 3 9 15 16 17 11 58 24 ...
 $ NumberOfEggsBelow           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ TeMales                     : int  3 3 0 3 2 5 5 3 8 8 ...
 $ TeFemales                   : int  6 9 2 5 2 10 4 4 9 6 ...
 $ TeQuiescentfemales          : int  0 0 0 0 0 0 3 0 3 4 ...
 $ TuMales                     : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuFemales                   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuQuiescentfemales          : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Observations                : chr  NA NA NA NA ...
 $ Block2                      : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ Rep2                        : Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Disk2                       : Factor w/ 16 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Leaf2                       : Factor w/ 2 levels "3","4": 1 2 1 2 1 2 1 2 1 2 ...
 $ Env2                        : Factor w/ 2 levels "Cd","N": 2 2 1 1 2 2 1 1 2 2 ...
 $ FocalSR2                    : Factor w/ 4 levels "1","2","4","5": 3 3 3 3 3 3 3 3 3 3 ...
 $ CompSR2                     : Factor w/ 4 levels "1","2","4","5": NA NA NA NA NA NA NA NA NA NA ...
 $ Type2                       : Factor w/ 2 levels "INTER","INTRA": 2 2 2 2 2 2 2 2 2 2 ...
 $ Focal_Female2               : Factor w/ 2 levels "Te","Tu": 1 1 1 1 1 1 1 1 1 1 ...
 $ Nr_Focal_Females_Tu_Alive_G0: num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_Te_Alive_G0: num  1 1 0 1 1 1 2 2 4 4 ...
 $ Num_Comp_Tu_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Num_Comp_Te_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_G0         : num  1 1 1 1 2 2 2 2 4 4 ...
 $ Nr_Comp_Females_G0          : num  0 0 0 0 1 1 1 1 3 3 ...
 $ GrowthRateOA                : num  6 9 2 5 1 5 2 2 2.25 1.5 ...
 $ GrowthRateOA_Q              : num  6 9 2 5 1 5 3.5 2 3 2.5 ...
 $ Replicate                   : chr  "1" "1" "1" "1" ...
rk_func<- function(lambda, alpha_ii, alpha_ij, dens_i, dens_j, ...){
  gr<-lambda*exp(-alpha_ii*dens_i - alpha_ij*dens_j)
  
  return(gr)
}

red_ca<-ca[,c("Env", "Rep", "FocalSR", "CompSR", "Dens", "Type", "TeFemales", "TuFemales", "GrowthRateOA")]

red_ca

red_ca$Dens_Focal<-sapply(c(1:length(red_ca[,1])), function(x){
  if(red_ca$Type[x]=="INTRA"){
    a<-red_ca$Dens[x]-1
  }else if(red_ca$Type[x]=="INTER"){
    a<-1
  }
  
  a
})

red_ca$Dens_Comp<-sapply(c(1:length(red_ca[,1])), function(x){
  if(red_ca$Type[x]=="INTRA"){
    a<-0
  }else if(red_ca$Type[x]=="INTER"){
    a<-red_ca$Dens[x]-1
  }
  
  a
})

red_ca$Focal<-mapvalues(red_ca$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4", "SR5"))
red_ca$Comp<-mapvalues(red_ca$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4", "SR5"))

red_ca$pred<-sapply(c(1:length(red_ca[,1])), function(x){
  
  if(red_ca$Focal[x]=="SR1" | red_ca$Focal[x]=="SR2"){
    aux_data<-subset(param_all_w0, Environment==red_ca$Env[x] & Replicate== red_ca$Rep[x] & as.character(Tu_Regime)==red_ca$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Tu_lambda[1], alpha_ii =aux_data$Tu_intra[1], alpha_ij = aux_data$Tu_inter[1], dens_i = red_ca$Dens_Focal[x], dens_j =  red_ca$Dens_Comp[x])
    
  }else if(red_ca$Focal[x]=="SR4" | red_ca$Focal[x]=="SR5"){
    aux_data<-subset(param_all_w0, Environment==red_ca$Env[x] & Replicate== red_ca$Rep[x] & as.character(Te_Regime)==red_ca$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Te_lambda[1], alpha_ii =aux_data$Te_intra[1], alpha_ij = aux_data$Te_inter[1], dens_i = red_ca$Dens_Focal[x], dens_j =  red_ca$Dens_Comp[x])
  }
  
  aux_pred
})

red_ca$pred_L<-sapply(c(1:length(red_ca[,1])), function(x){
  
  if(red_ca$Focal[x]=="SR1" | red_ca$Focal[x]=="SR2"){
    aux_data<-subset(param_all_w0_lower, Environment==red_ca$Env[x] & Replicate== red_ca$Rep[x] & as.character(Tu_Regime)==red_ca$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Tu_lambda[1], alpha_ii =aux_data$Tu_intra[1], alpha_ij = aux_data$Tu_inter[1], dens_i = red_ca$Dens_Focal[x], dens_j =  red_ca$Dens_Comp[x])
    
  }else if(red_ca$Focal[x]=="SR4" | red_ca$Focal[x]=="SR5"){
    aux_data<-subset(param_all_w0_lower, Environment==red_ca$Env[x] & Replicate== red_ca$Rep[x] & as.character(Te_Regime)==red_ca$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Te_lambda[1], alpha_ii =aux_data$Te_intra[1], alpha_ij = aux_data$Te_inter[1], dens_i = red_ca$Dens_Focal[x], dens_j =  red_ca$Dens_Comp[x])
  }
  
  aux_pred
})

red_ca$pred_U<-sapply(c(1:length(red_ca[,1])), function(x){
  
  if(red_ca$Focal[x]=="SR1" | red_ca$Focal[x]=="SR2"){
    aux_data<-subset(param_all_w0_upper, Environment==red_ca$Env[x] & Replicate== red_ca$Rep[x] & as.character(Tu_Regime)==red_ca$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Tu_lambda[1], alpha_ii =aux_data$Tu_intra[1], alpha_ij = aux_data$Tu_inter[1], dens_i = red_ca$Dens_Focal[x], dens_j =  red_ca$Dens_Comp[x])
    
  }else if(red_ca$Focal[x]=="SR4" | red_ca$Focal[x]=="SR5"){
    aux_data<-subset(param_all_w0_upper, Environment==red_ca$Env[x] & Replicate== red_ca$Rep[x] & as.character(Te_Regime)==red_ca$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Te_lambda[1], alpha_ii =aux_data$Te_intra[1], alpha_ij = aux_data$Te_inter[1], dens_i = red_ca$Dens_Focal[x], dens_j =  red_ca$Dens_Comp[x])
  }
  
  aux_pred
})

red_ca$Replicate<-red_ca$Rep
str(red_ca)
'data.frame':   3451 obs. of  17 variables:
 $ Env         : chr  "N" "N" "Cd" "Cd" ...
 $ Rep         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ FocalSR     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR      : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens        : int  1 1 1 1 2 2 2 2 4 4 ...
 $ Type        : chr  "INTRA" "INTRA" "INTRA" "INTRA" ...
 $ TeFemales   : int  6 9 2 5 2 10 4 4 9 6 ...
 $ TuFemales   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ GrowthRateOA: num  6 9 2 5 1 5 2 2 2.25 1.5 ...
 $ Dens_Focal  : num  0 0 0 0 1 1 1 1 3 3 ...
 $ Dens_Comp   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ Focal       : chr  "SR4" "SR4" "SR4" "SR4" ...
 $ Comp        : chr  NA NA NA NA ...
 $ pred        : num  4.84 4.84 2.09 2.09 4.74 ...
 $ pred_L      : num  3.85 3.85 1.8 1.8 3.92 ...
 $ pred_U      : num  5.84 5.84 2.38 2.38 5.49 ...
 $ Replicate   : int  1 1 1 1 1 1 1 1 1 1 ...
ggplot(subset(red_ca, Env=="N" & FocalSR==1), aes(x=log(GrowthRateOA+1), y=log(pred+1)))+
  facet_grid(CompSR~Replicate)+
  geom_abline(slope = 1, intercept=0)+
  geom_point()+
  ylab("Predicted")+
  xlab("Observed")+
  ggtitle("Normal environment Control urticae")


ggplot(subset(red_ca, Env=="N" & FocalSR==1), aes(x=GrowthRateOA, y=pred))+
  facet_grid(CompSR~Replicate)+
  geom_abline(slope = 1, intercept=0)+
  geom_point()+
  ylab("Predicted")+
  xlab("Observed")+
  ggtitle("Normal environment Control urticae")



ggplot(subset(red_ca, Env=="N" & FocalSR==1 & Type=="INTRA"), aes(y=GrowthRateOA, x=Dens_Focal))+
  facet_grid(.~Replicate)+
  geom_point(position=position_dodge2(0.5))+
  geom_line(aes(y=pred, x=Dens_Focal))+
 geom_ribbon(aes(ymin=pred_L, ymax=pred_U), fill="lightgrey", linetype="dashed", colour="black")+
  ylab("Growth rate")+
  xlab("Density")+
  ggtitle("Normal environment Control urticae Intra")


ggplot(subset(red_ca, Env=="N" & FocalSR==1 & Type=="INTER" & CompSR=="4"), aes(y=GrowthRateOA, x=Dens_Comp))+
  facet_grid(.~Replicate)+
  geom_point(position=position_dodge2(0.5))+
  geom_abline(data=subset(param_all_w0,Tu_Regime=="SR1" & Environment=="N"  & Te_Regime=="SR4"), aes(slope=-Tu_inter, intercept = Tu_lambda))+
  ylab("Growth rate")+
  xlab("Density")+
  ggtitle("Normal environment Control urticae Inter Control")


ggplot(subset(red_ca, Env=="N" & FocalSR==1 & Type=="INTER" & CompSR=="5"), aes(y=GrowthRateOA, x=Dens_Comp))+
  facet_grid(.~Replicate)+
  geom_point(position=position_dodge2(0.5))+
  geom_abline(data=subset(param_all_w0,Tu_Regime=="SR1" & Environment=="N"  & Te_Regime=="SR5"), aes(slope=-Tu_inter, intercept = Tu_lambda))+
  ylab("Growth rate")+
  xlab("Density")+
  ggtitle("Normal environment Control urticae Inter Evolved")

NA
NA

B - CXR lambda fixed

cxr accepts a data frame with a first column called fitness with positive values and numeric columns with number of individuals. Each row is one individual. For multiple species the easier is to create a list, each with a data frame that has in the first column number of individuals produced and then the number of neighbours

this case we transformed all 0s into 1 (so that the log is 0) For that we need to add +1 to all data so that the variance is not changed

normal
dir.create("./NewAnalyses/cxr_lambda_fixed_log", showWarnings = FALSE)

# modifying data frame to fit the type of setup that is need for CXR
CXR_B_N<-subset(ca, Env=="N")[,c("Rep", "FocalSR", "CompSR", "Dens", "TeFemales", "TuFemales")]

CXR_B_N$Focal<-mapvalues(CXR_B_N$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))
CXR_B_N$CompSR2<-mapvalues(CXR_B_N$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))

CXR_B_N$Comp<-sapply(c(1:length(CXR_B_N[,1])), function(x){
  if(is.na(CXR_B_N$CompSR2[x])){
    a<- CXR_B_N$Focal[x]
  }else{
    a<-CXR_B_N$CompSR2[x]
  }
  
  a
})

aux<-data.frame(SR1=rep(0, length(CXR_B_N[,1])), SR2=rep(0, length(CXR_B_N[,1])), SR4=rep(0, length(CXR_B_N[,1])), SR5=rep(0, length(CXR_B_N[,1])))

for(i in 1:length(CXR_B_N[,1])){
  #coluna onde por focais
  colunaF<-which(colnames(aux)==CXR_B_N$Focal[i])
  #coluna onde por competidors
  colunaC<-which(colnames(aux)==CXR_B_N$Comp[i])
  
  #if its the same regime
  if(CXR_B_N$Focal[i]==CXR_B_N$Comp[i] & CXR_B_N$Dens[i]==1){
    aux[i,colunaF]<-CXR_B_N$Dens[i]-1
    
  }else if(CXR_B_N$Focal[i]==CXR_B_N$Comp[i]){
    aux[i,colunaF]<-CXR_B_N$Dens[i]-1
  }else{ #if it is heterospecific then its -1 for the competitors (because of the focal) and its one for the focal
    aux[i,colunaC]<-CXR_B_N$Dens[i]-1
    aux[i, colunaF]<-1
  }
  
}

CXR_B_N<-cbind(CXR_B_N, aux)

CXR_B_N$fitness<-sapply(c(1:length(CXR_B_N[,1])), function(x){
  colF<-which(colnames(CXR_B_N)==CXR_B_N$Focal[x])
  
  if(CXR_B_N$Focal[x]=="SR1"){
    a<-CXR_B_N$TuFemales[x]/CXR_B_N$SR1[x]
  } else if(CXR_B_N$Focal[x]=="SR2"){
    a<-CXR_B_N$TuFemales[x]/CXR_B_N$SR2[x]
  } else if(CXR_B_N$Focal[x]=="SR4"){
    a<-CXR_B_N$TeFemales[x]/CXR_B_N$SR4[x]
  } else if(CXR_B_N$Focal[x]=="SR5"){
    a<-CXR_B_N$TeFemales[x]/CXR_B_N$SR5[x]
  }
  
  a
})

#removing rows for which there is no data for fitness
CXR_B_N<-CXR_B_N[-which(is.na(CXR_B_N$fitness)),]

# adding +1 to all data
#CXR_B_N$fitness<-CXR_B_N$fitness+1

CXR_B_N[which(CXR_B_N$fitness=="-Inf" | CXR_B_N$fitness=="Inf"),"fitness"]<-0


# all data gets +1 because of the 0 problem
CXR_B_N$fitness<-CXR_B_N$fitness+1

# vector that tells which are the selection regimes, the columns have to have the same name
my.reg <- c("SR1", "SR2","SR4","SR5")

# Do list per replicate and environment
R1<-list(SR1= subset(CXR_B_N, Rep==1 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(CXR_B_N, Rep==1 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(CXR_B_N, Rep==1 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(CXR_B_N, Rep==1 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R2<-list(SR1= subset(CXR_B_N, Rep==2 & Focal=="SR1")[,c("fitness", "SR1", "SR4", "SR5")], SR4= subset(CXR_B_N, Rep==2 & Focal=="SR4")[,c("fitness", "SR1", "SR4", "SR5")], SR5= subset(CXR_B_N, Rep==2 & Focal=="SR5")[,c("fitness", "SR1", "SR4", "SR5")])

R3<-list(SR1= subset(CXR_B_N, Rep==3 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(CXR_B_N, Rep==3 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(CXR_B_N, Rep==3 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(CXR_B_N, Rep==3 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R4<-list(SR1= subset(CXR_B_N, Rep==4 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(CXR_B_N, Rep==4 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(CXR_B_N, Rep==4 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(CXR_B_N, Rep==4 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R5<-list(SR1= subset(CXR_B_N, Rep==5 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(CXR_B_N, Rep==5 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(CXR_B_N, Rep==5 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(CXR_B_N, Rep==5 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

mean_dens1<-data.frame(SR=c(rep(1,10), rep(2,8), rep(4,10),rep(5,10)), Env=c(rep("N", 5),rep("Cd", 5), rep("N", 4),rep("Cd", 4),rep("N", 5),rep("Cd", 5),rep("N", 5),rep("Cd", 5)), Rep=c(rep(c(1,2,3,4,5),2),rep(c(1,3,4,5),2),rep(c(1,2,3,4,5),2),rep(c(1,2,3,4,5),2)))


#since in the model we use the log of data +1, here we also have to use the +1 to estimate the lambda
mean_dens1$lambda<-sapply(c(1:length(mean_dens1[,1])), function(x){
  mean(subset(ca, FocalSR==mean_dens1$SR[x] & Dens==1 & Env==mean_dens1$Env[x] & Rep==mean_dens1$Rep[x] )$GrowthRateOA+1, na.rm=TRUE)
})


mean_dens1$sd_lambda<-sapply(c(1:length(mean_dens1[,1])), function(x){
  sd(subset(ca, FocalSR==mean_dens1$SR[x] & Dens==1 & Env==mean_dens1$Env[x] & Rep==mean_dens1$Rep[x])$GrowthRateOA+1, na.rm=TRUE)
})

mean_dens1$sd_lambda[which(is.na(mean_dens1$sd_lambda))]<-0.01
mean_dens1$sd_lambda[which(mean_dens1$sd_lambda==0)]<-0.01

#### lambda

fixed_terms_1N <- list(list(lambda = subset(mean_dens1, Rep==1 & Env=="N" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="N" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="N" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==1 & Env=="N" & SR==5)$lambda))

fixed_terms_2N <- list(list(lambda = subset(mean_dens1, Rep==2 & Env=="N" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==2 & Env=="N" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==2 & Env=="N" & SR==5)$lambda))

fixed_terms_3N <- list(list(lambda = subset(mean_dens1, Rep==3 & Env=="N" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="N" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="N" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==3 & Env=="N" & SR==5)$lambda))

fixed_terms_4N <- list(list(lambda = subset(mean_dens1, Rep==4 & Env=="N" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="N" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="N" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==4 & Env=="N" & SR==5)$lambda))

fixed_terms_5N <- list(list(lambda = subset(mean_dens1, Rep==5 & Env=="N" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="N" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="N" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==5 & Env=="N" & SR==5)$lambda))


cxr_B.R1_w0<-cxr_pm_multifit(data = R1,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_1N,
                           # no standard errors
                           bootstrap_samples = 200)


cxr_B.R2_w0<-cxr_pm_multifit(data = R2,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                          initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2N,
                           # no standard errors
                           bootstrap_samples = 200)
cxr_pm_fit: a focal column is provided, but it 
            contains no densities > 0. It will be discarded.
Error in all_neigh_matrix[, z] : subscript out of bounds
cxr_pm_bootstrap ERROR : Cannot evaluate function at initial parameters 
cxr_pm_fit: a focal column is provided, but it 
            contains no densities > 0. It will be discarded.
Error in all_neigh_matrix[, z] : subscript out of bounds
cxr_pm_bootstrap ERROR : Cannot evaluate function at initial parameters 
cxr_B.R3_w0<-cxr_pm_multifit(data = R3,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_3N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_B.R4_w0<-cxr_pm_multifit(data = R4,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_3N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_B.R5_w0<-cxr_pm_multifit(data = R5,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                          initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_5N,
                           # no standard errors
                           bootstrap_samples = 200)

summary(cxr_B.R1_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
          SR1        SR2        SR4        SR5
SR1 0.1152073         NA 0.06228645 0.08110864
SR2        NA 0.08740496 0.08543745 0.08550777
SR4 0.1856830 0.15249776 0.15904629         NA
SR5 0.1298725 0.18237359         NA 0.13676259
summary(cxr_B.R2_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
          SR1        SR4        SR5
SR1 0.1172894 0.06509954 0.01802708
SR4 0.1470504 0.07173698         NA
SR5 0.1505072         NA 0.15769431
summary(cxr_B.R3_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
          SR1        SR2        SR4        SR5
SR1 0.1049483         NA 0.08653311 0.07231917
SR2        NA 0.04410714 0.03756058 0.01975269
SR4 0.1502023 0.08148835 0.11380584         NA
SR5 0.1140247 0.09888509         NA 0.18246871
summary(cxr_B.R4_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
          SR1       SR2       SR4        SR5
SR1 0.1159686        NA 0.1158970 0.13195567
SR2        NA 0.1287665 0.0969120 0.06779875
SR4 0.1733748 0.1552535 0.2017891         NA
SR5 0.1756829 0.1620642        NA 0.18269408
summary(cxr_B.R5_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
           SR1        SR2        SR4
SR1 0.02834927         NA 0.06040919
SR2         NA 0.05122945 0.07768747
SR4 0.14021797 0.16510937 0.13032500
SR5 0.19789959 0.16403343         NA
            SR5
SR1  0.03234430
SR2 -0.02517362
SR4          NA
SR5  0.14473888
#ab<-abundance_projection(cxr_B.R1_w0, timesteps = 1, initial_abundances = c(3,3,3,3))

rows in the alpha element of the returning list correspond to species i and columns to species j for each αij coefficient.

data table summary

cxr_param_B<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("N"))
cxr_param_B$Tu_lambda<-0
cxr_param_B$Te_lambda<-0
cxr_param_B$Tu_intra<-0
cxr_param_B$Te_intra<-0
cxr_param_B$Tu_inter<-0
cxr_param_B$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_B<-cxr_param_B[-which(cxr_param_B$Replicate==2 & cxr_param_B$Tu_Regime=="SR2"),]


cxr_param_B[which(cxr_param_B$Replicate==1),"Tu_lambda"]<-c(cxr_B.R1_w0$fixed_terms[[1]]$lambda,cxr_B.R1_w0$fixed_terms[[2]]$lambda)
cxr_param_B[which(cxr_param_B$Replicate==1),"Te_lambda"]<-c(cxr_B.R1_w0$fixed_terms[[3]]$lambda,cxr_B.R1_w0$fixed_terms[[3]]$lambda, cxr_B.R1_w0$fixed_terms[[4]]$lambda,cxr_B.R1_w0$fixed_terms[[4]]$lambda)

cxr_param_B[which(cxr_param_B$Replicate==2),"Tu_lambda"]<-c(cxr_B.R2_w0$fixed_terms[[1]]$lambda,cxr_B.R2_w0$fixed_terms[[1]]$lambda)
cxr_param_B[which(cxr_param_B$Replicate==2),"Te_lambda"]<-c(cxr_B.R2_w0$fixed_terms[[2]]$lambda,cxr_B.R2_w0$fixed_terms[[3]]$lambda)

cxr_param_B[which(cxr_param_B$Replicate==3),"Tu_lambda"]<-c(cxr_B.R3_w0$fixed_terms[[1]]$lambda,cxr_B.R3_w0$fixed_terms[[2]]$lambda)
cxr_param_B[which(cxr_param_B$Replicate==3),"Te_lambda"]<-c(cxr_B.R3_w0$fixed_terms[[3]]$lambda,cxr_B.R3_w0$fixed_terms[[3]]$lambda, cxr_B.R3_w0$fixed_terms[[4]]$lambda,cxr_B.R3_w0$fixed_terms[[4]]$lambda)

cxr_param_B[which(cxr_param_B$Replicate==4),"Tu_lambda"]<-c(cxr_B.R4_w0$fixed_terms[[1]]$lambda,cxr_B.R4_w0$fixed_terms[[2]]$lambda)
cxr_param_B[which(cxr_param_B$Replicate==4),"Te_lambda"]<-c(cxr_B.R4_w0$fixed_terms[[3]]$lambda,cxr_B.R4_w0$fixed_terms[[3]]$lambda, cxr_B.R4_w0$fixed_terms[[4]]$lambda,cxr_B.R4_w0$fixed_terms[[4]]$lambda)

cxr_param_B[which(cxr_param_B$Replicate==5),"Tu_lambda"]<-c(cxr_B.R5_w0$fixed_terms[[1]]$lambda,cxr_B.R5_w0$fixed_terms[[2]]$lambda)
cxr_param_B[which(cxr_param_B$Replicate==5),"Te_lambda"]<-c(cxr_B.R5_w0$fixed_terms[[3]]$lambda,cxr_B.R5_w0$fixed_terms[[3]]$lambda, cxr_B.R5_w0$fixed_terms[[4]]$lambda,cxr_B.R5_w0$fixed_terms[[4]]$lambda)


cxr_param_B[which(cxr_param_B$Replicate==1),"Tu_intra"]<-rep(c(cxr_B.R1_w0$alpha_matrix[1,1], cxr_B.R1_w0$alpha_matrix[2,2]), 2)
cxr_param_B[which(cxr_param_B$Replicate==1),"Te_intra"]<-rep(c(cxr_B.R1_w0$alpha_matrix[3,3], cxr_B.R1_w0$alpha_matrix[4,4]), each=2)

cxr_param_B[which(cxr_param_B$Replicate==2),"Tu_intra"]<-rep(c(cxr_B.R2_w0$alpha_matrix[1,1]), 2)
cxr_param_B[which(cxr_param_B$Replicate==2),"Te_intra"]<-rep(c(cxr_B.R2_w0$alpha_matrix[2,2], cxr_B.R2_w0$alpha_matrix[3,3]))

cxr_param_B[which(cxr_param_B$Replicate==3),"Tu_intra"]<-rep(c(cxr_B.R3_w0$alpha_matrix[1,1], cxr_B.R3_w0$alpha_matrix[2,2]), 2)
cxr_param_B[which(cxr_param_B$Replicate==3),"Te_intra"]<-rep(c(cxr_B.R3_w0$alpha_matrix[3,3], cxr_B.R3_w0$alpha_matrix[4,4]), each=2)

cxr_param_B[which(cxr_param_B$Replicate==4),"Tu_intra"]<-rep(c(cxr_B.R4_w0$alpha_matrix[1,1], cxr_B.R4_w0$alpha_matrix[2,2]), 2)
cxr_param_B[which(cxr_param_B$Replicate==4),"Te_intra"]<-rep(c(cxr_B.R4_w0$alpha_matrix[3,3], cxr_B.R4_w0$alpha_matrix[4,4]), each=2)

cxr_param_B[which(cxr_param_B$Replicate==5),"Tu_intra"]<-rep(c(cxr_B.R5_w0$alpha_matrix[1,1], cxr_B.R5_w0$alpha_matrix[2,2]), 2)
cxr_param_B[which(cxr_param_B$Replicate==5),"Te_intra"]<-rep(c(cxr_B.R5_w0$alpha_matrix[3,3], cxr_B.R5_w0$alpha_matrix[4,4]), each=2)


cxr_param_B[which(cxr_param_B$Replicate==1),"Tu_inter"]<-c(cxr_B.R1_w0$alpha_matrix[1,3], cxr_B.R1_w0$alpha_matrix[2,3],cxr_B.R1_w0$alpha_matrix[1,4], cxr_B.R1_w0$alpha_matrix[2,4])
cxr_param_B[which(cxr_param_B$Replicate==1),"Te_inter"]<-c(cxr_B.R1_w0$alpha_matrix[3,1], cxr_B.R1_w0$alpha_matrix[3,2],cxr_B.R1_w0$alpha_matrix[4,1], cxr_B.R1_w0$alpha_matrix[4,2])

cxr_param_B[which(cxr_param_B$Replicate==2),"Tu_inter"]<-c(cxr_B.R2_w0$alpha_matrix[1,2], cxr_B.R2_w0$alpha_matrix[1,3])
cxr_param_B[which(cxr_param_B$Replicate==2),"Te_inter"]<-c(cxr_B.R2_w0$alpha_matrix[2,1],cxr_B.R2_w0$alpha_matrix[3,1])

cxr_param_B[which(cxr_param_B$Replicate==3),"Tu_inter"]<-c(cxr_B.R3_w0$alpha_matrix[1,3], cxr_B.R3_w0$alpha_matrix[2,3],cxr_B.R3_w0$alpha_matrix[1,4], cxr_B.R3_w0$alpha_matrix[2,4])
cxr_param_B[which(cxr_param_B$Replicate==3),"Te_inter"]<-c(cxr_B.R3_w0$alpha_matrix[3,1], cxr_B.R3_w0$alpha_matrix[3,2],cxr_B.R3_w0$alpha_matrix[4,1], cxr_B.R3_w0$alpha_matrix[4,2])

cxr_param_B[which(cxr_param_B$Replicate==4),"Tu_inter"]<-c(cxr_B.R4_w0$alpha_matrix[1,3], cxr_B.R4_w0$alpha_matrix[2,3],cxr_B.R4_w0$alpha_matrix[1,4], cxr_B.R4_w0$alpha_matrix[2,4])
cxr_param_B[which(cxr_param_B$Replicate==4),"Te_inter"]<-c(cxr_B.R4_w0$alpha_matrix[3,1], cxr_B.R4_w0$alpha_matrix[3,2],cxr_B.R4_w0$alpha_matrix[4,1], cxr_B.R4_w0$alpha_matrix[4,2])

cxr_param_B[which(cxr_param_B$Replicate==5),"Tu_inter"]<-c(cxr_B.R5_w0$alpha_matrix[1,3], cxr_B.R5_w0$alpha_matrix[2,3],cxr_B.R5_w0$alpha_matrix[1,4], cxr_B.R5_w0$alpha_matrix[2,4])
cxr_param_B[which(cxr_param_B$Replicate==5),"Te_inter"]<-c(cxr_B.R5_w0$alpha_matrix[3,1], cxr_B.R5_w0$alpha_matrix[3,2],cxr_B.R5_w0$alpha_matrix[4,1], cxr_B.R5_w0$alpha_matrix[4,2])

### Lower

cxr_param_B_lower<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("N"))
cxr_param_B_lower$Tu_lambda<-0
cxr_param_B_lower$Te_lambda<-0
cxr_param_B_lower$Tu_intra<-0
cxr_param_B_lower$Te_intra<-0
cxr_param_B_lower$Tu_inter<-0
cxr_param_B_lower$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_B_lower<-cxr_param_B_lower[-which(cxr_param_B_lower$Replicate==2 & cxr_param_B_lower$Tu_Regime=="SR2"),]

#Since the error comes directly from the data we need to create some lists with that information
sd_1N <- list(list(lambda = subset(mean_dens1, Rep==1 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="N" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==1 & Env=="N" & SR==5)$sd_lambda))

sd_2N <- list(list(lambda = subset(mean_dens1, Rep==2 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==2 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==2 & Env=="N" & SR==5)$sd_lambda))

sd_3N <- list(list(lambda = subset(mean_dens1, Rep==3 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="N" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==3 & Env=="N" & SR==5)$sd_lambda))

sd_4N <- list(list(lambda = subset(mean_dens1, Rep==4 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="N" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==4 & Env=="N" & SR==5)$sd_lambda))

sd_5N <- list(list(lambda = subset(mean_dens1, Rep==5 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="N" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==5 & Env=="N" & SR==5)$sd_lambda))

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==1),"Tu_lambda"]<-c(cxr_B.R1_w0$fixed_terms[[1]]$lambda-sd_1N[[1]]$lambda,cxr_B.R1_w0$fixed_terms[[2]]$lambda-sd_1N[[2]]$lambda)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==1),"Te_lambda"]<-c(cxr_B.R1_w0$fixed_terms[[3]]$lambda-sd_1N[[3]]$lambda,cxr_B.R1_w0$fixed_terms[[3]]$lambda-sd_1N[[3]]$lambda, cxr_B.R1_w0$fixed_terms[[4]]$lambda-sd_1N[[4]]$lambda,cxr_B.R1_w0$fixed_terms[[4]]$lambda-sd_1N[[4]]$lambda)

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==2),"Tu_lambda"]<-c(cxr_B.R2_w0$fixed_terms[[1]]$lambda-sd_2N[[1]]$lambda,cxr_B.R2_w0$fixed_terms[[1]]$lambda-sd_2N[[1]]$lambda)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==2),"Te_lambda"]<-c(cxr_B.R2_w0$fixed_terms[[2]]$lambda-sd_2N[[2]]$lambda,cxr_B.R2_w0$fixed_terms[[3]]$lambda-sd_2N[[3]]$lambda)

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==3),"Tu_lambda"]<-c(cxr_B.R3_w0$fixed_terms[[1]]$lambda-sd_3N[[1]]$lambda,cxr_B.R3_w0$fixed_terms[[2]]$lambda-sd_3N[[2]]$lambda)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==3),"Te_lambda"]<-c(cxr_B.R3_w0$fixed_terms[[3]]$lambda-sd_3N[[3]]$lambda,cxr_B.R3_w0$fixed_terms[[3]]$lambda-sd_3N[[3]]$lambda, cxr_B.R3_w0$fixed_terms[[4]]$lambda-sd_3N[[4]]$lambda,cxr_B.R3_w0$fixed_terms[[4]]$lambda-sd_3N[[4]]$lambda)

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==4),"Tu_lambda"]<-c(cxr_B.R4_w0$fixed_terms[[1]]$lambda-sd_4N[[1]]$lambda,cxr_B.R4_w0$fixed_terms[[2]]$lambda-sd_4N[[2]]$lambda)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==4),"Te_lambda"]<-c(cxr_B.R4_w0$fixed_terms[[3]]$lambda-sd_4N[[3]]$lambda,cxr_B.R4_w0$fixed_terms[[3]]$lambda-sd_4N[[3]]$lambda, cxr_B.R4_w0$fixed_terms[[4]]$lambda-sd_4N[[4]]$lambda,cxr_B.R4_w0$fixed_terms[[4]]$lambda-sd_4N[[4]]$lambda)

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==5),"Tu_lambda"]<-c(cxr_B.R5_w0$fixed_terms[[1]]$lambda-sd_5N[[1]]$lambda,cxr_B.R5_w0$fixed_terms[[2]]$lambda-sd_5N[[2]]$lambda)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==5),"Te_lambda"]<-c(cxr_B.R5_w0$fixed_terms[[3]]$lambda-sd_5N[[3]]$lambda,cxr_B.R5_w0$fixed_terms[[3]]$lambda-sd_5N[[3]]$lambda, cxr_B.R5_w0$fixed_terms[[4]]$lambda-sd_5N[[4]]$lambda,cxr_B.R5_w0$fixed_terms[[4]]$lambda-sd_5N[[4]]$lambda)


cxr_param_B_lower[which(cxr_param_B_lower$Replicate==1),"Tu_intra"]<-rep(c(cxr_B.R1_w0$alpha_matrix[1,1]-cxr_B.R1_w0$alpha_matrix_standard_error[1,1], cxr_B.R1_w0$alpha_matrix[2,2]-cxr_B.R1_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==1),"Te_intra"]<-rep(c(cxr_B.R1_w0$alpha_matrix[3,3]-cxr_B.R1_w0$alpha_matrix_standard_error[3,3], cxr_B.R1_w0$alpha_matrix[4,4]-cxr_B.R1_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==2),"Tu_intra"]<-rep(c(cxr_B.R2_w0$alpha_matrix[1,1]-cxr_B.R2_w0$alpha_matrix_standard_error[1,1]), 2)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==2),"Te_intra"]<-c(cxr_B.R2_w0$alpha_matrix[2,2]-cxr_B.R2_w0$alpha_matrix_standard_error[2,2], cxr_B.R2_w0$alpha_matrix[3,3]-cxr_B.R2_w0$alpha_matrix_standard_error[3,3])

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==3),"Tu_intra"]<-rep(c(cxr_B.R3_w0$alpha_matrix[1,1]-cxr_B.R3_w0$alpha_matrix_standard_error[1,1], cxr_B.R3_w0$alpha_matrix[2,2]-cxr_B.R3_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==3),"Te_intra"]<-rep(c(cxr_B.R3_w0$alpha_matrix[3,3]-cxr_B.R3_w0$alpha_matrix_standard_error[3,3], cxr_B.R3_w0$alpha_matrix[4,4]-cxr_B.R3_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==4),"Tu_intra"]<-rep(c(cxr_B.R4_w0$alpha_matrix[1,1]-cxr_B.R4_w0$alpha_matrix_standard_error[1,1], cxr_B.R4_w0$alpha_matrix[2,2]-cxr_B.R4_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==4),"Te_intra"]<-rep(c(cxr_B.R4_w0$alpha_matrix[3,3]-cxr_B.R4_w0$alpha_matrix_standard_error[3,3], cxr_B.R4_w0$alpha_matrix[4,4]-cxr_B.R4_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==5),"Tu_intra"]<-rep(c(cxr_B.R5_w0$alpha_matrix[1,1]-cxr_B.R5_w0$alpha_matrix_standard_error[1,1], cxr_B.R5_w0$alpha_matrix[2,2]-cxr_B.R5_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==5),"Te_intra"]<-rep(c(cxr_B.R5_w0$alpha_matrix[3,3]-cxr_B.R5_w0$alpha_matrix_standard_error[3,3], cxr_B.R5_w0$alpha_matrix[4,4]-cxr_B.R5_w0$alpha_matrix_standard_error[4,4]), each=2)


cxr_param_B_lower[which(cxr_param_B_lower$Replicate==1),"Tu_inter"]<-c(cxr_B.R1_w0$alpha_matrix[1,3]-cxr_B.R1_w0$alpha_matrix_standard_error[1,3], cxr_B.R1_w0$alpha_matrix[2,3]-cxr_B.R1_w0$alpha_matrix_standard_error[2,3],cxr_B.R1_w0$alpha_matrix[1,4]-cxr_B.R1_w0$alpha_matrix_standard_error[1,4], cxr_B.R1_w0$alpha_matrix[2,4]-cxr_B.R1_w0$alpha_matrix_standard_error[2,4])
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==1),"Te_inter"]<-c(cxr_B.R1_w0$alpha_matrix[3,1]-cxr_B.R1_w0$alpha_matrix_standard_error[3,1], cxr_B.R1_w0$alpha_matrix[3,2]-cxr_B.R1_w0$alpha_matrix_standard_error[3,2],cxr_B.R1_w0$alpha_matrix[4,1]-cxr_B.R1_w0$alpha_matrix_standard_error[4,1], cxr_B.R1_w0$alpha_matrix[4,2]-cxr_B.R1_w0$alpha_matrix_standard_error[4,2])

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==2),"Tu_inter"]<-c(cxr_B.R2_w0$alpha_matrix[1,2]-cxr_B.R2_w0$alpha_matrix_standard_error[1,2], cxr_B.R2_w0$alpha_matrix[1,3]-cxr_B.R2_w0$alpha_matrix_standard_error[1,3])
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==2),"Te_inter"]<-c(cxr_B.R2_w0$alpha_matrix[2,1]-cxr_B.R2_w0$alpha_matrix_standard_error[2,1], cxr_B.R2_w0$alpha_matrix[3,1]-cxr_B.R2_w0$alpha_matrix_standard_error[3,1])

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==3),"Tu_inter"]<-c(cxr_B.R3_w0$alpha_matrix[1,3]-cxr_B.R3_w0$alpha_matrix_standard_error[1,3], cxr_B.R3_w0$alpha_matrix[2,3]-cxr_B.R3_w0$alpha_matrix_standard_error[2,3],cxr_B.R3_w0$alpha_matrix[1,4]-cxr_B.R3_w0$alpha_matrix_standard_error[1,4], cxr_B.R3_w0$alpha_matrix[2,4]-cxr_B.R3_w0$alpha_matrix_standard_error[2,4])
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==3),"Te_inter"]<-c(cxr_B.R3_w0$alpha_matrix[3,1]-cxr_B.R3_w0$alpha_matrix_standard_error[3,1], cxr_B.R3_w0$alpha_matrix[3,2]-cxr_B.R3_w0$alpha_matrix_standard_error[3,2],cxr_B.R3_w0$alpha_matrix[4,1]-cxr_B.R3_w0$alpha_matrix_standard_error[4,1], cxr_B.R3_w0$alpha_matrix[4,2]-cxr_B.R3_w0$alpha_matrix_standard_error[4,2])

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==4),"Tu_inter"]<-c(cxr_B.R4_w0$alpha_matrix[1,3]-cxr_B.R4_w0$alpha_matrix_standard_error[1,3], cxr_B.R4_w0$alpha_matrix[2,3]-cxr_B.R4_w0$alpha_matrix_standard_error[2,3],cxr_B.R4_w0$alpha_matrix[1,4]-cxr_B.R4_w0$alpha_matrix_standard_error[1,4], cxr_B.R4_w0$alpha_matrix[2,4]-cxr_B.R4_w0$alpha_matrix_standard_error[2,4])
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==4),"Te_inter"]<-c(cxr_B.R4_w0$alpha_matrix[3,1]-cxr_B.R4_w0$alpha_matrix_standard_error[3,1], cxr_B.R4_w0$alpha_matrix[3,2]-cxr_B.R4_w0$alpha_matrix_standard_error[3,2],cxr_B.R4_w0$alpha_matrix[4,1]-cxr_B.R4_w0$alpha_matrix_standard_error[4,1], cxr_B.R4_w0$alpha_matrix[4,2]-cxr_B.R4_w0$alpha_matrix_standard_error[4,2])

cxr_param_B_lower[which(cxr_param_B_lower$Replicate==5),"Tu_inter"]<-c(cxr_B.R5_w0$alpha_matrix[1,3]-cxr_B.R5_w0$alpha_matrix_standard_error[1,3], cxr_B.R5_w0$alpha_matrix[2,3]-cxr_B.R5_w0$alpha_matrix_standard_error[2,3],cxr_B.R5_w0$alpha_matrix[1,4]-cxr_B.R5_w0$alpha_matrix_standard_error[1,4], cxr_B.R5_w0$alpha_matrix[2,4]-cxr_B.R5_w0$alpha_matrix_standard_error[2,4])
cxr_param_B_lower[which(cxr_param_B_lower$Replicate==5),"Te_inter"]<-c(cxr_B.R5_w0$alpha_matrix[3,1]-cxr_B.R5_w0$alpha_matrix_standard_error[3,1], cxr_B.R5_w0$alpha_matrix[3,2]-cxr_B.R5_w0$alpha_matrix_standard_error[3,2],cxr_B.R5_w0$alpha_matrix[4,1]-cxr_B.R5_w0$alpha_matrix_standard_error[4,1], cxr_B.R5_w0$alpha_matrix[4,2]-cxr_B.R5_w0$alpha_matrix_standard_error[4,2])

### upper

cxr_param_B_upper<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("N"))
cxr_param_B_upper$Tu_lambda<-0
cxr_param_B_upper$Te_lambda<-0
cxr_param_B_upper$Tu_intra<-0
cxr_param_B_upper$Te_intra<-0
cxr_param_B_upper$Tu_inter<-0
cxr_param_B_upper$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_B_upper<-cxr_param_B_upper[-which(cxr_param_B_upper$Replicate==2 & cxr_param_B_upper$Tu_Regime=="SR2"),]


cxr_param_B_upper[which(cxr_param_B_upper$Replicate==1),"Tu_lambda"]<-c(cxr_B.R1_w0$fixed_terms[[1]]$lambda+sd_1N[[1]]$lambda,cxr_B.R1_w0$fixed_terms[[2]]$lambda+sd_1N[[2]]$lambda)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==1),"Te_lambda"]<-c(cxr_B.R1_w0$fixed_terms[[3]]$lambda+sd_1N[[3]]$lambda,cxr_B.R1_w0$fixed_terms[[3]]$lambda+sd_1N[[3]]$lambda, cxr_B.R1_w0$fixed_terms[[4]]$lambda+sd_1N[[4]]$lambda,cxr_B.R1_w0$fixed_terms[[4]]$lambda+sd_1N[[4]]$lambda)

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==2),"Tu_lambda"]<-c(cxr_B.R2_w0$fixed_terms[[1]]$lambda+sd_2N[[1]]$lambda,cxr_B.R2_w0$fixed_terms[[1]]$lambda+sd_2N[[1]]$lambda)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==2),"Te_lambda"]<-c(cxr_B.R2_w0$fixed_terms[[2]]$lambda+sd_2N[[2]]$lambda,cxr_B.R2_w0$fixed_terms[[3]]$lambda+sd_2N[[3]]$lambda)

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==3),"Tu_lambda"]<-c(cxr_B.R3_w0$fixed_terms[[1]]$lambda+sd_3N[[1]]$lambda,cxr_B.R3_w0$fixed_terms[[2]]$lambda+sd_3N[[2]]$lambda)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==3),"Te_lambda"]<-c(cxr_B.R3_w0$fixed_terms[[3]]$lambda+sd_3N[[3]]$lambda,cxr_B.R3_w0$fixed_terms[[3]]$lambda+sd_3N[[3]]$lambda, cxr_B.R3_w0$fixed_terms[[4]]$lambda+sd_3N[[4]]$lambda,cxr_B.R3_w0$fixed_terms[[4]]$lambda+sd_3N[[4]]$lambda)

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==4),"Tu_lambda"]<-c(cxr_B.R4_w0$fixed_terms[[1]]$lambda+sd_4N[[1]]$lambda,cxr_B.R4_w0$fixed_terms[[2]]$lambda+sd_4N[[2]]$lambda)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==4),"Te_lambda"]<-c(cxr_B.R4_w0$fixed_terms[[3]]$lambda+sd_4N[[3]]$lambda,cxr_B.R4_w0$fixed_terms[[3]]$lambda+sd_4N[[3]]$lambda, cxr_B.R4_w0$fixed_terms[[4]]$lambda+sd_4N[[4]]$lambda,cxr_B.R4_w0$fixed_terms[[4]]$lambda+sd_4N[[4]]$lambda)

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==5),"Tu_lambda"]<-c(cxr_B.R5_w0$fixed_terms[[1]]$lambda+sd_5N[[1]]$lambda,cxr_B.R5_w0$fixed_terms[[2]]$lambda+sd_5N[[2]]$lambda)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==5),"Te_lambda"]<-c(cxr_B.R5_w0$fixed_terms[[3]]$lambda+sd_5N[[3]]$lambda,cxr_B.R5_w0$fixed_terms[[3]]$lambda+sd_5N[[3]]$lambda, cxr_B.R5_w0$fixed_terms[[4]]$lambda+sd_5N[[4]]$lambda,cxr_B.R5_w0$fixed_terms[[4]]$lambda+sd_5N[[4]]$lambda)


cxr_param_B_upper[which(cxr_param_B_upper$Replicate==1),"Tu_intra"]<-rep(c(cxr_B.R1_w0$alpha_matrix[1,1]+cxr_B.R1_w0$alpha_matrix_standard_error[1,1], cxr_B.R1_w0$alpha_matrix[2,2]+cxr_B.R1_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==1),"Te_intra"]<-rep(c(cxr_B.R1_w0$alpha_matrix[3,3]+cxr_B.R1_w0$alpha_matrix_standard_error[3,3], cxr_B.R1_w0$alpha_matrix[4,4]+cxr_B.R1_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==2),"Tu_intra"]<-rep(c(cxr_B.R2_w0$alpha_matrix[1,1]+cxr_B.R2_w0$alpha_matrix_standard_error[1,1]), 2)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==2),"Te_intra"]<-c(cxr_B.R2_w0$alpha_matrix[2,2]+cxr_B.R2_w0$alpha_matrix_standard_error[2,2], cxr_B.R2_w0$alpha_matrix[3,3]+cxr_B.R2_w0$alpha_matrix_standard_error[3,3])

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==3),"Tu_intra"]<-rep(c(cxr_B.R3_w0$alpha_matrix[1,1]+cxr_B.R3_w0$alpha_matrix_standard_error[1,1], cxr_B.R3_w0$alpha_matrix[2,2]+cxr_B.R3_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==3),"Te_intra"]<-rep(c(cxr_B.R3_w0$alpha_matrix[3,3]+cxr_B.R3_w0$alpha_matrix_standard_error[3,3], cxr_B.R3_w0$alpha_matrix[4,4]+cxr_B.R3_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==4),"Tu_intra"]<-rep(c(cxr_B.R4_w0$alpha_matrix[1,1]+cxr_B.R4_w0$alpha_matrix_standard_error[1,1], cxr_B.R4_w0$alpha_matrix[2,2]+cxr_B.R4_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==4),"Te_intra"]<-rep(c(cxr_B.R4_w0$alpha_matrix[3,3]+cxr_B.R4_w0$alpha_matrix_standard_error[3,3], cxr_B.R4_w0$alpha_matrix[4,4]+cxr_B.R4_w0$alpha_matrix_standard_error[4,4]), each=2)

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==5),"Tu_intra"]<-rep(c(cxr_B.R5_w0$alpha_matrix[1,1]+cxr_B.R5_w0$alpha_matrix_standard_error[1,1], cxr_B.R5_w0$alpha_matrix[2,2]+cxr_B.R5_w0$alpha_matrix_standard_error[2,2]), 2)
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==5),"Te_intra"]<-rep(c(cxr_B.R5_w0$alpha_matrix[3,3]+cxr_B.R5_w0$alpha_matrix_standard_error[3,3], cxr_B.R5_w0$alpha_matrix[4,4]+cxr_B.R5_w0$alpha_matrix_standard_error[4,4]), each=2)


cxr_param_B_upper[which(cxr_param_B_upper$Replicate==1),"Tu_inter"]<-c(cxr_B.R1_w0$alpha_matrix[1,3]+cxr_B.R1_w0$alpha_matrix_standard_error[1,3], cxr_B.R1_w0$alpha_matrix[2,3]+cxr_B.R1_w0$alpha_matrix_standard_error[2,3],cxr_B.R1_w0$alpha_matrix[1,4]+cxr_B.R1_w0$alpha_matrix_standard_error[1,4], cxr_B.R1_w0$alpha_matrix[2,4]+cxr_B.R1_w0$alpha_matrix_standard_error[2,4])
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==1),"Te_inter"]<-c(cxr_B.R1_w0$alpha_matrix[3,1]+cxr_B.R1_w0$alpha_matrix_standard_error[3,1], cxr_B.R1_w0$alpha_matrix[3,2]+cxr_B.R1_w0$alpha_matrix_standard_error[3,2],cxr_B.R1_w0$alpha_matrix[4,1]+cxr_B.R1_w0$alpha_matrix_standard_error[4,1], cxr_B.R1_w0$alpha_matrix[4,2]+cxr_B.R1_w0$alpha_matrix_standard_error[4,2])

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==2),"Tu_inter"]<-c(cxr_B.R2_w0$alpha_matrix[1,2]+cxr_B.R2_w0$alpha_matrix_standard_error[1,2], cxr_B.R2_w0$alpha_matrix[1,3]+cxr_B.R2_w0$alpha_matrix_standard_error[1,3])
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==2),"Te_inter"]<-c(cxr_B.R2_w0$alpha_matrix[2,1]+cxr_B.R2_w0$alpha_matrix_standard_error[2,1], cxr_B.R2_w0$alpha_matrix[3,1]+cxr_B.R2_w0$alpha_matrix_standard_error[3,1])

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==3),"Tu_inter"]<-c(cxr_B.R3_w0$alpha_matrix[1,3]+cxr_B.R3_w0$alpha_matrix_standard_error[1,3], cxr_B.R3_w0$alpha_matrix[2,3]+cxr_B.R3_w0$alpha_matrix_standard_error[2,3],cxr_B.R3_w0$alpha_matrix[1,4]+cxr_B.R3_w0$alpha_matrix_standard_error[1,4], cxr_B.R3_w0$alpha_matrix[2,4]+cxr_B.R3_w0$alpha_matrix_standard_error[2,4])
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==3),"Te_inter"]<-c(cxr_B.R3_w0$alpha_matrix[3,1]+cxr_B.R3_w0$alpha_matrix_standard_error[3,1], cxr_B.R3_w0$alpha_matrix[3,2]+cxr_B.R3_w0$alpha_matrix_standard_error[3,2],cxr_B.R3_w0$alpha_matrix[4,1]+cxr_B.R3_w0$alpha_matrix_standard_error[4,1], cxr_B.R3_w0$alpha_matrix[4,2]+cxr_B.R3_w0$alpha_matrix_standard_error[4,2])

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==4),"Tu_inter"]<-c(cxr_B.R4_w0$alpha_matrix[1,3]+cxr_B.R4_w0$alpha_matrix_standard_error[1,3], cxr_B.R4_w0$alpha_matrix[2,3]+cxr_B.R4_w0$alpha_matrix_standard_error[2,3],cxr_B.R4_w0$alpha_matrix[1,4]+cxr_B.R4_w0$alpha_matrix_standard_error[1,4], cxr_B.R4_w0$alpha_matrix[2,4]+cxr_B.R4_w0$alpha_matrix_standard_error[2,4])
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==4),"Te_inter"]<-c(cxr_B.R4_w0$alpha_matrix[3,1]+cxr_B.R4_w0$alpha_matrix_standard_error[3,1], cxr_B.R4_w0$alpha_matrix[3,2]+cxr_B.R4_w0$alpha_matrix_standard_error[3,2],cxr_B.R4_w0$alpha_matrix[4,1]+cxr_B.R4_w0$alpha_matrix_standard_error[4,1], cxr_B.R4_w0$alpha_matrix[4,2]+cxr_B.R4_w0$alpha_matrix_standard_error[4,2])

cxr_param_B_upper[which(cxr_param_B_upper$Replicate==5),"Tu_inter"]<-c(cxr_B.R5_w0$alpha_matrix[1,3]+cxr_B.R5_w0$alpha_matrix_standard_error[1,3], cxr_B.R5_w0$alpha_matrix[2,3]+cxr_B.R5_w0$alpha_matrix_standard_error[2,3],cxr_B.R5_w0$alpha_matrix[1,4]+cxr_B.R5_w0$alpha_matrix_standard_error[1,4], cxr_B.R5_w0$alpha_matrix[2,4]+cxr_B.R5_w0$alpha_matrix_standard_error[2,4])
cxr_param_B_upper[which(cxr_param_B_upper$Replicate==5),"Te_inter"]<-c(cxr_B.R5_w0$alpha_matrix[3,1]+cxr_B.R5_w0$alpha_matrix_standard_error[3,1], cxr_B.R5_w0$alpha_matrix[3,2]+cxr_B.R5_w0$alpha_matrix_standard_error[3,2],cxr_B.R5_w0$alpha_matrix[4,1]+cxr_B.R5_w0$alpha_matrix_standard_error[4,1], cxr_B.R5_w0$alpha_matrix[4,2]+cxr_B.R5_w0$alpha_matrix_standard_error[4,2])
Cadmium
# modifying data frame to fit the type of setup that is need for CXR
CXR_B_Cd<-subset(ca, Env=="Cd")[,c("Rep", "FocalSR", "CompSR", "Dens", "TeFemales", "TuFemales")]

CXR_B_Cd$Focal<-mapvalues(CXR_B_Cd$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))
CXR_B_Cd$CompSR2<-mapvalues(CXR_B_Cd$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))

CXR_B_Cd$Comp<-sapply(c(1:length(CXR_B_Cd[,1])), function(x){
  if(is.na(CXR_B_Cd$CompSR2[x])){
    a<- CXR_B_Cd$Focal[x]
  }else{
    a<-CXR_B_Cd$CompSR2[x]
  }
  
  a
})

aux<-data.frame(SR1=rep(0, length(CXR_B_Cd[,1])), SR2=rep(0, length(CXR_B_Cd[,1])), SR4=rep(0, length(CXR_B_Cd[,1])), SR5=rep(0, length(CXR_B_Cd[,1])))

for(i in 1:length(CXR_B_Cd[,1])){
  #coluna onde por focais
  colunaF<-which(colnames(aux)==CXR_B_Cd$Focal[i])
  #coluna onde por competidors
  colunaC<-which(colnames(aux)==CXR_B_Cd$Comp[i])
  
  #if its the same regime
  if(CXR_B_Cd$Focal[i]==CXR_B_Cd$Comp[i] & CXR_B_Cd$Dens[i]==1){
    aux[i,colunaF]<-CXR_B_Cd$Dens[i]-1
    
  }else if(CXR_B_Cd$Focal[i]==CXR_B_Cd$Comp[i]){
    aux[i,colunaF]<-CXR_B_Cd$Dens[i]-1
  }else{ #if it is heterospecific then its -1 for the competitors (because of the focal) and its one for the focal
    aux[i,colunaC]<-CXR_B_Cd$Dens[i]-1
    aux[i, colunaF]<-1
  }
  
}

CXR_B_Cd<-cbind(CXR_B_Cd, aux)

CXR_B_Cd$fitness<-sapply(c(1:length(CXR_B_Cd[,1])), function(x){
  colF<-which(colnames(CXR_B_Cd)==CXR_B_Cd$Focal[x])
  
  if(CXR_B_Cd$Focal[x]=="SR1"){
    a<-CXR_B_Cd$TuFemales[x]/CXR_B_Cd$SR1[x]
  } else if(CXR_B_Cd$Focal[x]=="SR2"){
    a<-CXR_B_Cd$TuFemales[x]/CXR_B_Cd$SR2[x]
  } else if(CXR_B_Cd$Focal[x]=="SR4"){
    a<-CXR_B_Cd$TeFemales[x]/CXR_B_Cd$SR4[x]
  } else if(CXR_B_Cd$Focal[x]=="SR5"){
    a<-CXR_B_Cd$TeFemales[x]/CXR_B_Cd$SR5[x]
  }
  
  a
})

#removing rows for which there is no data for fitness
#CXR_B_Cd<-CXR_B_Cd[-which(is.na(CXR_B_Cd$fitness)),]
#CXR_B_Cd$fitness<-CXR_B_Cd$fitness+1

CXR_B_Cd[which(CXR_B_Cd$fitness=="-Inf" | CXR_B_Cd$fitness=="Inf"),"fitness"]<-0

#0 to 1 to mainrain data
CXR_B_Cd<-CXR_B_Cd[-which(is.na(CXR_B_Cd$fitness)),]
CXR_B_Cd$fitness<-CXR_B_Cd$fitness+1



# vector that tells which are the selection regimes, the columns have to have the same name
my.reg <- c("SR1", "SR2","SR4","SR5")

# Do list per replicate and environment
R1_Cd<-list(SR1= subset(CXR_B_Cd, Rep==1 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(CXR_B_Cd, Rep==1 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(CXR_B_Cd, Rep==1 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(CXR_B_Cd, Rep==1 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R2_Cd<-list(SR1= subset(CXR_B_Cd, Rep==2 & Focal=="SR1")[,c("fitness", "SR1", "SR2","SR4", "SR5")], SR4= subset(CXR_B_Cd, Rep==2 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(CXR_B_Cd, Rep==2 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R3_Cd<-list(SR1= subset(CXR_B_Cd, Rep==3 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(CXR_B_Cd, Rep==3 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(CXR_B_Cd, Rep==3 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(CXR_B_Cd, Rep==3 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R4_Cd<-list(SR1= subset(CXR_B_Cd, Rep==4 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(CXR_B_Cd, Rep==4 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(CXR_B_Cd, Rep==4 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(CXR_B_Cd, Rep==4 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

R5_Cd<-list(SR1= subset(CXR_B_Cd, Rep==5 & Focal=="SR1")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR2= subset(CXR_B_Cd, Rep==5 & Focal=="SR2")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR4= subset(CXR_B_Cd, Rep==5 & Focal=="SR4")[,c("fitness", "SR1", "SR2", "SR4", "SR5")], SR5= subset(CXR_B_Cd, Rep==5 & Focal=="SR5")[,c("fitness", "SR1", "SR2", "SR4", "SR5")])

fixed_terms_1Cd <- list(list(lambda = subset(mean_dens1, Rep==1 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="Cd" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==1 & Env=="Cd" & SR==5)$lambda))

fixed_terms_2Cd <- list(list(lambda = subset(mean_dens1, Rep==2 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==2 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==2 & Env=="Cd" & SR==5)$lambda))

fixed_terms_3Cd <- list(list(lambda = subset(mean_dens1, Rep==3 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="Cd" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==3 & Env=="Cd" & SR==5)$lambda))

fixed_terms_4Cd <- list(list(lambda = subset(mean_dens1, Rep==4 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="Cd" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==4 & Env=="Cd" & SR==5)$lambda))

fixed_terms_5Cd <- list(list(lambda = subset(mean_dens1, Rep==5 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="Cd" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==5 & Env=="Cd" & SR==5)$lambda))

cxr_B.R1_Cd_w0<-cxr_pm_multifit(data = R1_Cd,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                          initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_1Cd,
                           # no standard errors
                           bootstrap_samples = 200)

# replicate 2 below


cxr_B.R3_Cd_w0<-cxr_pm_multifit(data = R3_Cd,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_3Cd,
                           # no standard errors
                           bootstrap_samples =10)

cxr_B.R4_Cd_w0<-cxr_pm_multifit(data = R4_Cd,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                          initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_4Cd,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_B.R5_Cd_w0<-cxr_pm_multifit(data = R5_Cd,
                           focal_column = my.reg,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_5Cd,
                           # no standard errors
                           bootstrap_samples = 200)

summary(cxr_B.R1_Cd_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
           SR1        SR2        SR4        SR5
SR1 0.04584548         NA 0.05556988 0.04349890
SR2         NA 0.06757583 0.04081173 0.04680983
SR4 0.03890394 0.07072264 0.09908637         NA
SR5 0.11799967 0.09104722         NA 0.15488950
#summary(cxr_B.R2_Cd_w0)
summary(cxr_B.R3_Cd_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
            SR1          SR2          SR4
SR1 0.002343429           NA -0.012755707
SR2          NA -0.023284929 -0.006172213
SR4 0.083002640  0.007698104  0.056114178
SR5 0.068766280  0.022130484           NA
            SR5
SR1 -0.01294586
SR2 -0.01497267
SR4          NA
SR5  0.06106163
summary(cxr_B.R4_Cd_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
           SR1         SR2         SR4
SR1 0.05359984          NA 0.037647969
SR2         NA 0.014609303 0.005563145
SR4 0.02483767 0.094226200 0.099437652
SR5 0.06218425 0.001456832          NA
            SR5
SR1  0.04685735
SR2 -0.01089155
SR4          NA
SR5  0.04178655
summary(cxr_B.R5_Cd_w0)
model: 'RK_pm_alpha_pairwise_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
             SR1         SR2        SR4
SR1  0.025879570          NA 0.03814373
SR2           NA  0.05776287 0.06843702
SR4  0.009265975  0.03998117 0.06246490
SR5 -0.008943842 -0.01236246         NA
            SR5
SR1 -0.02413730
SR2  0.05740409
SR4          NA
SR5  0.03308326
### For replicate I can't find good initial conditions, lets do this by hand

# cxr_B.R2_Cd_w0<-cxr_pm_multifit(data = R2_Cd,
#                            focal_column = my.reg[c(1,3,4)],
#                            model_family = "BH",
#                            covariates = NULL,
#                           optimization_method = "Nelder-Mead",
#                           alpha_form = "pairwise",
#                           lambda_cov_form = "none",
#                           alpha_cov_form = "none",
#                            initial_values = list(lambda = 1,
#                                                  alpha_intra = 0.1,
#                                                  alpha_inter = 0.1),
#                           fixed_terms = NULL,
#                            # no standard errors
#                            bootstrap_samples =10)

# This one works well
cxr_B.R2_Cd_w0_sr1<-cxr_pm_fit(data = R2_Cd[[1]],
                           focal_column = my.reg[1],
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(alpha_intra = 0.1,
                                                 alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2Cd[[1]],
                           # no standard errors
                           bootstrap_samples = 200)

#for replicate 2 we will do the fitting by hand because we may need to scale the parameters

cxr_B.R2_Cd_w0_sr4<-cxr_pm_fit(data = R2_Cd[[2]][which(R2_Cd[[2]][,"SR1"]==0), c("fitness", "SR4")],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2Cd[[2]],
                           # no standard errors
                           bootstrap_samples = 200)

 cxr_B.R2_Cd_w0_5<-cxr_pm_fit(data = R2_Cd[[3]][which(R2_Cd[[3]][,"SR1"]==0), c("fitness", "SR5")],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                        initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2Cd[[3]],
                           # no standard errors
                           bootstrap_samples = 200)
 

cxr_B.R2_Cd_w0_sr4_inter<-cxr_pm_fit(data = R2_Cd[[2]][which(R2_Cd[[2]][,"SR1"]!=0), c("fitness", "SR1")],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                           initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2Cd[[2]],
                           # no standard errors
                           bootstrap_samples = 200)

 cxr_B.R2_Cd_w0_sr5_inter<-cxr_pm_fit(data = R2_Cd[[3]][which(R2_Cd[[3]][,"SR1"]!=0), c("fitness", "SR1")],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                        initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2Cd[[3]],
                           # no standard errors
                           bootstrap_samples = 200)
data table summary
cxr_param_BC_upper[which(cxr_param_BC_upper$Replicate==2),"Te_intra"]<-c(cxr_B.R2_Cd_w0_sr4$alpha_inter[1]+cxr_B.R2_Cd_w0_sr4$alpha_inter_standard_error[1], cxr_B.R2_Cd_w0_sr5$alpha_inter[1]+cxr_B.R2_Cd_w0_sr5$alpha_inter_standard_error[1])
Error: object 'cxr_B.R2_Cd_w0_sr5' not found
joining data frame

param_all_B<-as.data.frame(rbind(cxr_param_B, cxr_param_BC))

param_all_B_lower<-as.data.frame(rbind(cxr_param_B_lower, cxr_param_BC_lower))
param_all_B_upper<-as.data.frame(rbind(cxr_param_B_upper, cxr_param_BC_upper))

param_all_B_lower
param_all_B_upper

write.csv(param_all_B, "./NewAnalyses/cxr_lambda_fixed_log/parameters_cxr_lambda_fixed.csv")
write.csv(param_all_B_upper, "./NewAnalyses/cxr_lambda_fixed_log/parameters_cxr_lambda_fixed_upper.csv")
write.csv(param_all_B_lower, "./NewAnalyses/cxr_lambda_fixed_log/parameters_cxr_lambda_fixed_lower.csv")
importing data frame

param_all_B<-read.csv("./NewAnalyses/cxr_lambda_fixed_log/parameters_cxr_lambda_fixed.csv")
param_all_B_upper<-read.csv("./NewAnalyses/cxr_lambda_fixed_log/parameters_cxr_lambda_fixed_upper.csv")
param_all_B_lower<-read.csv("./NewAnalyses/cxr_lambda_fixed_log/parameters_cxr_lambda_fixed_lower.csv")

param_all_B<-param_all_B[,-1]
param_all_B_upper<-param_all_B_upper[,-1]
param_all_B_lower<-param_all_B_lower[,-1]
Plotting data

param_all_B_long<-gather(param_all_B, parameter, value,Tu_lambda:Te_inter )

param_all_B_long$category<-mapvalues(param_all_B_long$parameter, c("Tu_lambda", "Te_lambda", "Tu_intra", "Te_intra","Tu_inter", "Te_inter"), c("lambda", "lambda", "intra", "intra", "inter", "inter"))

param_all_B_lower_long<-gather(param_all_B_lower, parameter, value,Tu_lambda:Te_inter )

param_all_B_lower_long$category<-mapvalues(param_all_B_lower_long$parameter, c("Tu_lambda", "Te_lambda", "Tu_intra", "Te_intra","Tu_inter", "Te_inter"), c("lambda", "lambda", "intra", "intra", "inter", "inter"))

param_all_B_upper_long<-gather(param_all_B_upper, parameter, value,Tu_lambda:Te_inter )

param_all_B_upper_long$category<-mapvalues(param_all_B_upper_long$parameter, c("Tu_lambda", "Te_lambda", "Tu_intra", "Te_intra","Tu_inter", "Te_inter"), c("lambda", "lambda", "intra", "intra", "inter", "inter"))

colnames(param_all_B_lower_long)[6]<-"lower"
colnames(param_all_B_upper_long)[6]<-"upper"

str(param_all_B_long)
'data.frame':   216 obs. of  7 variables:
 $ Tu_Regime  : chr  "SR1" "SR2" "SR1" "SR2" ...
 $ Te_Regime  : chr  "SR4" "SR4" "SR5" "SR5" ...
 $ Replicate  : int  1 1 1 1 2 2 3 3 3 3 ...
 $ Environment: chr  "N" "N" "N" "N" ...
 $ parameter  : chr  "Tu_lambda" "Tu_lambda" "Tu_lambda" "Tu_lambda" ...
 $ value      : num  3.9 3.7 3.9 3.7 4.2 ...
 $ category   : chr  "lambda" "lambda" "lambda" "lambda" ...
param_all_B_long<-cbind(param_all_B_long[,1:7],param_all_B_lower_long$lower, param_all_B_upper_long$upper)

colnames(param_all_B_long)[8:9]<-c("lower","upper")


ggplot(subset(param_all_B_long, parameter=="Te_intra" & Tu_Regime=="SR1"), aes(x=Te_Regime, y=value, fill=Environment))+
  geom_boxplot( position=position_dodge2(0.5), outlier.alpha = 99)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("Evolved \nwithout cadmium", "Evolved \nwith cadmium"))+
  scale_fill_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  scale_colour_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Selection regime")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTe_w0_rep.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_intra" & Te_Regime=="SR4"), aes(x=Tu_Regime, y=value, fill=Environment))+
  geom_boxplot(position=position_dodge2(0.5), outlier.alpha = 99)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("Evolved \nwithout cadmium", "Evolved \nwith cadmium"))+
  scale_fill_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  scale_colour_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Selection regime")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTu_w0_rep.pdf", width=20, height=15)




ggplot(subset(param_all_B_long, parameter=="Te_intra" & Tu_Regime=="SR1" & Environment=="Cd"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot(position=position_dodge2(0.5), outlier.alpha = 99)+
  geom_point(alpha=0.85, position=position_dodge2(0.5))+
  theme_ines+
  scale_fill_manual(values=c("#D55E00", "#009E73"))+
  scale_x_discrete(labels=c("Evolved \nwithout cadmium", "Evolved \nwith cadmium"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Selection regime")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTe_w0_rep_evol.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_intra" & Te_Regime=="SR4" & Environment=="Cd"), aes(x=Tu_Regime, y=value, fill=Tu_Regime))+
  geom_boxplot( position=position_dodge2(0.5), outlier.alpha = 99)+
  geom_point(alpha=0.85, position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("Evolved \nwithout cadmium", "Evolved \nwith cadmium"))+
  scale_fill_manual(values=c("#D55E00", "#009E73"))+
  scale_colour_manual(values=c("#D55E00", "#009E73"), labels=c("Water", "Cadmium"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Selection regime")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTu_w0_rep_evol.pdf", width=20, height=15)



ggplot(subset(param_all_B_long, parameter=="Te_intra" & Tu_Regime=="SR1"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTe_w0_rep_env.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_intra" & Te_Regime=="SR4"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Homogeneous"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Homogeneous"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTu_w0_rep_env.pdf", width=20, height=15)



ggplot(subset(param_all_B_long, parameter=="Te_inter"), aes(x=Environment, y=value, fill=Te_Regime))+
  facet_grid(Tu_Regime~., labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_interTe_w0_rep_env.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_inter"), aes(fill=Tu_Regime, y=value, x=Environment))+
  facet_grid(Te_Regime~., labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Homogeneous"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Homogeneous"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_interTu_w0_rep_env.pdf", width=20, height=15)



ggplot(subset(param_all_B_long, parameter=="Te_lambda" & Tu_Regime=="SR1"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( position=position_dodge2(0.5), outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Homogeneous"))+
  ylab("Intrinsic growth rate (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_lambdaTe_w0_rep_env.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_lambda" & Te_Regime=="SR4"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot(position=position_dodge2(0.5), outlier.alpha =0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Homogeneous"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Homogeneous"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_lambdaTu_w0_rep_env.pdf", width=20, height=15)



###########


ggplot(subset(param_all_B_long, parameter=="Te_intra" & Tu_Regime=="SR1" & Environment=="Cd"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")+
  ylim(c(0.03,0.27))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTe_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Te_intra" & Tu_Regime=="SR1" & Environment=="N"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")+
  ylim(c(0.03,0.27))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_intra" & Te_Regime=="SR4" & Environment=="Cd"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")+
  ylim(c(0.03,0.27))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTu_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_intra" & Te_Regime=="SR4" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")+
  ylim(c(0.03,0.27))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_intraTu_w0_rep_N.pdf", width=20, height=15)



ggplot(subset(param_all_B_long, parameter=="Te_inter" & Environment=="Cd"), aes(x=Environment, y=value, fill=Te_Regime))+
  facet_grid(.~Tu_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Environment")+
  ylim(c(-0.05, 0.16))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_interTe_w0_rep_Cd.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Te_inter" & Environment=="N"), aes(x=Environment, y=value, fill=Te_Regime))+
  facet_grid(.~Tu_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Environment")+
  ylim(c(-0.05, 0.16))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_interTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_inter" & Environment=="Cd"), aes(fill=Tu_Regime, y=value, x=Environment))+
  facet_grid(.~Te_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Environment")+
  ylim(c(-0.05, 0.12))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_interTu_w0_rep_Cd.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_inter" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Environment))+
  facet_grid(.~Te_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Environment")+
  ylim(c(-0.05, 0.12))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_interTu_w0_rep_N.pdf", width=20, height=15)



ggplot(subset(param_all_B_long, parameter=="Te_lambda" & Tu_Regime=="SR1" & Environment=="Cd"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. evansi)")+
  xlab("Environment")+
  ylim(c(0, 3))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_lambdaTe_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Te_lambda" & Tu_Regime=="SR1" & Environment=="N"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. evansi)")+
  xlab("Environment")+
  ylim(c(0, 8))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_lambdaTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_lambda" & Te_Regime=="SR4" & Environment=="Cd"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c( "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Environment")+
  ylim(c(0, 3))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_lambdaTu_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(param_all_B_long, parameter=="Tu_lambda" & Te_Regime=="SR4" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Environment")+
  ylim(c(0, 8))
save_plot("./NewAnalyses/cxr_lambda_fixed_log/param_RK_lambdaTu_w0_rep_N.pdf", width=20, height=15)

NA
NA

Predicting densities


density_aux<-seq(0, 10, by=(10/100))

pred_df_cxr_B<-as.data.frame(expand_grid(Density=density_aux, Tu_Regime=c("SR1","SR2"), Te_Regime=c("SR4","SR5"), Replicate=c(1:5), Environment=c("N", "Cd")))

pred_df_cxr_B$Tu_mean_intra<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Tu_mean_inter<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_B$Density[x])
    
    pred
})


pred_df_cxr_B$Tu_intra_L<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Tu_inter_L<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Tu_intra_U<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Tu_inter_U<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Te_mean_intra<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Te_mean_inter<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_B, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Te_intra_L<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Te_inter_L<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_B_lower, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Te_intra_U<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_B$Density[x])
    
    pred
})

pred_df_cxr_B$Te_inter_U<-sapply(c(1:length(pred_df_cxr_B[,1])), function(x){
   alpha_i<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Tu_Regime==pred_df_cxr_B$Tu_Regime[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_B_upper, Environment==pred_df_cxr_B$Environment[x] & Te_Regime==pred_df_cxr_B$Te_Regime[x] & Replicate==pred_df_cxr_B$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_B$Density[x])
    
    pred
})

# Removing Tu evolved replicate 2 because there is no data
pred_df_cxr_B<-pred_df_cxr_B[-which(pred_df_cxr_B$Tu_Regime=="SR2" & pred_df_cxr_B$Replicate==2),]



# Transforming everything bellow 0 into 0 for the lower interval

pred_df_cxr_B$Te_inter_L[which(pred_df_cxr_B$Te_inter_L<0)]<-0
pred_df_cxr_B$Te_intra_L[which(pred_df_cxr_B$Te_intra_L<0)]<-0
pred_df_cxr_B$Tu_inter_L[which(pred_df_cxr_B$Tu_inter_L<0)]<-0
pred_df_cxr_B$Tu_intra_L[which(pred_df_cxr_B$Tu_intra_L<0)]<-0
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific control environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="Cd" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="Cd" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific cadmium environment")

Plotting predictions

CONTROL INTRA
ca$Replicate<-as.character(ca$Rep)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific control environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/pred_Tu_INTRA_Control_water.pdf", width=25, height=10)


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="Cd" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="Cd" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific cadmium environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/pred_Tu_INTRA_Control_cadmium.pdf", width=25, height=10)


#subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="Cd" & Replicate==3)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="N" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="N" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific control environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/pred_Te_INTRA_Control_control.pdf", width=25, height=10)

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="Cd" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="Cd" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific cadmium environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_log/pred_Te_INTRA_Control_cadmium.pdf", width=25, height=10)

CONTROL INTER vs control
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="N" & Te_Regime=="SR4"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="N" & Te_Regime=="SR4"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu & Te control interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="Cd" & Te_Regime=="SR4"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="Cd" & Te_Regime=="SR4"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu & Te control interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="N" & Tu_Regime=="SR1"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="N" & Tu_Regime=="SR1"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te  & Tu control intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="Cd" & Tu_Regime=="SR1"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="Cd" & Tu_Regime=="SR1"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te & Tu control interspecific cadmium environment")

CONTROL INTER vs evolved
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="N" & Te_Regime=="SR5"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="N" & Te_Regime=="SR5"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu control & Te evolved interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="Cd" & Te_Regime=="SR5"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR1" & Environment=="Cd" & Te_Regime=="SR5"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu control & Te evolved interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="N" & Tu_Regime=="SR2"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="N" & Tu_Regime=="SR2"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te control  & Tu evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="Cd" & Tu_Regime=="SR2"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR4" & Environment=="Cd" & Tu_Regime=="SR2"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te control  & Tu evolved interspecific cadmium environment")

CONTROL INTRA evolved
ca$Replicate<-as.character(ca$Rep)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved intraspecific control environment")


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="Cd" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="Cd" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved intraspecific cadmium environment")


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="N" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="N" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="Cd" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="Cd" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved intraspecific cadmium environment")

Evolved INTER vs control
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="N" & Te_Regime=="SR4"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="N" & Te_Regime=="SR4"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te control interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="Cd" & Te_Regime=="SR4"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="Cd" & Te_Regime=="SR4"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te control interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="N" & Tu_Regime=="SR1"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="N" & Tu_Regime=="SR1"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu control intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="Cd" & Tu_Regime=="SR1"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="Cd" & Tu_Regime=="SR1"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved & Tu control interspecific cadmium environment")

evolved INTER vs evolved
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="N" & Te_Regime=="SR5"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="N" & Te_Regime=="SR5"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te evolved interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="Cd" & Te_Regime=="SR5"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Tu_Regime=="SR2" & Environment=="Cd" & Te_Regime=="SR5"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te evolved interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="N" & Tu_Regime=="SR2"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="N" & Tu_Regime=="SR2"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="Cd" & Tu_Regime=="SR2"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_B, Te_Regime=="SR5" & Environment=="Cd" & Tu_Regime=="SR2"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu evolved interspecific cadmium environment")

Predicted vs observed

str(param_all_B)
'data.frame':   36 obs. of  10 variables:
 $ Tu_Regime  : chr  "SR1" "SR2" "SR1" "SR2" ...
 $ Te_Regime  : chr  "SR4" "SR4" "SR5" "SR5" ...
 $ Replicate  : int  1 1 1 1 2 2 3 3 3 3 ...
 $ Environment: chr  "N" "N" "N" "N" ...
 $ Tu_lambda  : num  3.9 3.7 3.9 3.7 4.2 ...
 $ Te_lambda  : num  11.11 11.11 10 10 9.86 ...
 $ Tu_intra   : num  0.1152 0.0874 0.1152 0.0874 0.1173 ...
 $ Te_intra   : num  0.159 0.159 0.1368 0.1368 0.0717 ...
 $ Tu_inter   : num  0.0623 0.0854 0.0811 0.0855 0.0651 ...
 $ Te_inter   : num  0.186 0.152 0.13 0.182 0.147 ...
str(ca)
'data.frame':   3451 obs. of  42 variables:
 $ Block                       : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Rep                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Box                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Leaf                        : int  3 4 3 4 3 4 3 4 3 4 ...
 $ Disk                        : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Env                         : chr  "N" "N" "Cd" "Cd" ...
 $ FocalSR                     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR                      : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens                        : int  1 1 1 1 2 2 2 2 4 4 ...
 $ Type                        : chr  "INTRA" "INTRA" "INTRA" "INTRA" ...
 $ Focalfemale                 : chr  "Te" "Te" "Te" "Te" ...
 $ FocalDead                   : int  0 0 1 0 1 1 0 0 0 0 ...
 $ FocalDrowned                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ FocalMissing                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumbDeadComp                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumberOfEggs                : int  11 21 3 9 15 16 17 11 58 24 ...
 $ NumberOfEggsBelow           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ TeMales                     : int  3 3 0 3 2 5 5 3 8 8 ...
 $ TeFemales                   : int  6 9 2 5 2 10 4 4 9 6 ...
 $ TeQuiescentfemales          : int  0 0 0 0 0 0 3 0 3 4 ...
 $ TuMales                     : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuFemales                   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuQuiescentfemales          : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Observations                : chr  NA NA NA NA ...
 $ Block2                      : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ Rep2                        : Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Disk2                       : Factor w/ 16 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Leaf2                       : Factor w/ 2 levels "3","4": 1 2 1 2 1 2 1 2 1 2 ...
 $ Env2                        : Factor w/ 2 levels "Cd","N": 2 2 1 1 2 2 1 1 2 2 ...
 $ FocalSR2                    : Factor w/ 4 levels "1","2","4","5": 3 3 3 3 3 3 3 3 3 3 ...
 $ CompSR2                     : Factor w/ 4 levels "1","2","4","5": NA NA NA NA NA NA NA NA NA NA ...
 $ Type2                       : Factor w/ 2 levels "INTER","INTRA": 2 2 2 2 2 2 2 2 2 2 ...
 $ Focal_Female2               : Factor w/ 2 levels "Te","Tu": 1 1 1 1 1 1 1 1 1 1 ...
 $ Nr_Focal_Females_Tu_Alive_G0: num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_Te_Alive_G0: num  1 1 0 1 1 1 2 2 4 4 ...
 $ Num_Comp_Tu_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Num_Comp_Te_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_G0         : num  1 1 1 1 2 2 2 2 4 4 ...
 $ Nr_Comp_Females_G0          : num  0 0 0 0 1 1 1 1 3 3 ...
 $ GrowthRateOA                : num  6 9 2 5 1 5 2 2 2.25 1.5 ...
 $ GrowthRateOA_Q              : num  6 9 2 5 1 5 3.5 2 3 2.5 ...
 $ Replicate                   : chr  "1" "1" "1" "1" ...
rk_func<- function(lambda, alpha_ii, alpha_ij, dens_i, dens_j, ...){
  gr<-lambda*exp(-alpha_ii*dens_i - alpha_ij*dens_j)
  
  return(gr)
}

red_ca_B<-ca[,c("Env", "Rep", "FocalSR", "CompSR", "Dens", "Type", "TeFemales", "TuFemales", "GrowthRateOA")]

red_ca_B

red_ca_B$Dens_Focal<-sapply(c(1:length(red_ca_B[,1])), function(x){
  if(red_ca_B$Type[x]=="INTRA"){
    a<-red_ca_B$Dens[x]-1
  }else if(red_ca_B$Type[x]=="INTER"){
    a<-1
  }
  
  a
})

red_ca_B$Dens_Comp<-sapply(c(1:length(red_ca_B[,1])), function(x){
  if(red_ca_B$Type[x]=="INTRA"){
    a<-0
  }else if(red_ca_B$Type[x]=="INTER"){
    a<-red_ca_B$Dens[x]-1
  }
  
  a
})

red_ca_B$Focal<-mapvalues(red_ca_B$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4", "SR5"))
red_ca_B$Comp<-mapvalues(red_ca_B$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4", "SR5"))

red_ca_B$pred<-sapply(c(1:length(red_ca_B[,1])), function(x){
  
  if(red_ca_B$Focal[x]=="SR1" | red_ca_B$Focal[x]=="SR2"){
    aux_data<-subset(param_all_B, Environment==red_ca_B$Env[x] & Replicate== red_ca_B$Rep[x] & as.character(Tu_Regime)==red_ca_B$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Tu_lambda[1], alpha_ii =aux_data$Tu_intra[1], alpha_ij = aux_data$Tu_inter[1], dens_i = red_ca_B$Dens_Focal[x], dens_j =  red_ca_B$Dens_Comp[x])
    
  }else if(red_ca_B$Focal[x]=="SR4" | red_ca_B$Focal[x]=="SR5"){
    aux_data<-subset(param_all_B, Environment==red_ca_B$Env[x] & Replicate== red_ca_B$Rep[x] & as.character(Te_Regime)==red_ca_B$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Te_lambda[1], alpha_ii =aux_data$Te_intra[1], alpha_ij = aux_data$Te_inter[1], dens_i = red_ca_B$Dens_Focal[x], dens_j =  red_ca_B$Dens_Comp[x])
  }
  
  aux_pred
})

red_ca_B$pred_L<-sapply(c(1:length(red_ca_B[,1])), function(x){
  
  if(red_ca_B$Focal[x]=="SR1" | red_ca_B$Focal[x]=="SR2"){
    aux_data<-subset(param_all_B_lower, Environment==red_ca_B$Env[x] & Replicate== red_ca_B$Rep[x] & as.character(Tu_Regime)==red_ca_B$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Tu_lambda[1], alpha_ii =aux_data$Tu_intra[1], alpha_ij = aux_data$Tu_inter[1], dens_i = red_ca_B$Dens_Focal[x], dens_j =  red_ca_B$Dens_Comp[x])
    
  }else if(red_ca_B$Focal[x]=="SR4" | red_ca_B$Focal[x]=="SR5"){
    aux_data<-subset(param_all_B_lower, Environment==red_ca_B$Env[x] & Replicate== red_ca_B$Rep[x] & as.character(Te_Regime)==red_ca_B$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Te_lambda[1], alpha_ii =aux_data$Te_intra[1], alpha_ij = aux_data$Te_inter[1], dens_i = red_ca_B$Dens_Focal[x], dens_j =  red_ca_B$Dens_Comp[x])
  }
  
  aux_pred
})

red_ca_B$pred_U<-sapply(c(1:length(red_ca_B[,1])), function(x){
  
  if(red_ca_B$Focal[x]=="SR1" | red_ca_B$Focal[x]=="SR2"){
    aux_data<-subset(param_all_B_upper, Environment==red_ca_B$Env[x] & Replicate== red_ca_B$Rep[x] & as.character(Tu_Regime)==red_ca_B$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Tu_lambda[1], alpha_ii =aux_data$Tu_intra[1], alpha_ij = aux_data$Tu_inter[1], dens_i = red_ca_B$Dens_Focal[x], dens_j =  red_ca_B$Dens_Comp[x])
    
  }else if(red_ca_B$Focal[x]=="SR4" | red_ca_B$Focal[x]=="SR5"){
    aux_data<-subset(param_all_B_upper, Environment==red_ca_B$Env[x] & Replicate== red_ca_B$Rep[x] & as.character(Te_Regime)==red_ca_B$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Te_lambda[1], alpha_ii =aux_data$Te_intra[1], alpha_ij = aux_data$Te_inter[1], dens_i = red_ca_B$Dens_Focal[x], dens_j =  red_ca_B$Dens_Comp[x])
  }
  
  aux_pred
})

red_ca_B$Replicate<-red_ca_B$Rep
str(red_ca_B)
'data.frame':   3451 obs. of  17 variables:
 $ Env         : chr  "N" "N" "Cd" "Cd" ...
 $ Rep         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ FocalSR     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR      : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens        : int  1 1 1 1 2 2 2 2 4 4 ...
 $ Type        : chr  "INTRA" "INTRA" "INTRA" "INTRA" ...
 $ TeFemales   : int  6 9 2 5 2 10 4 4 9 6 ...
 $ TuFemales   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ GrowthRateOA: num  6 9 2 5 1 5 2 2 2.25 1.5 ...
 $ Dens_Focal  : num  0 0 0 0 1 1 1 1 3 3 ...
 $ Dens_Comp   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ Focal       : chr  "SR4" "SR4" "SR4" "SR4" ...
 $ Comp        : chr  NA NA NA NA ...
 $ pred        : num  11.11 11.11 3.3 3.3 9.48 ...
 $ pred_L      : num  6.41 6.41 1.41 1.41 5.58 ...
 $ pred_U      : num  15.81 15.81 5.19 5.19 13.21 ...
 $ Replicate   : int  1 1 1 1 1 1 1 1 1 1 ...
ggplot(subset(red_ca_B, Env=="N" & FocalSR==1), aes(x=log(GrowthRateOA+1), y=log(pred+1)))+
  facet_grid(CompSR~Replicate)+
  geom_abline(slope = 1, intercept=0)+
  geom_point()+
  ylab("Predicted")+
  xlab("Observed")+
  ggtitle("Normal environment Control urticae")


ggplot(subset(red_ca_B, Env=="N" & FocalSR==1), aes(x=GrowthRateOA, y=pred))+
  facet_grid(CompSR~Replicate)+
  geom_abline(slope = 1, intercept=0)+
  geom_point()+
  ylab("Predicted")+
  xlab("Observed")+
  ggtitle("Normal environment Control urticae")



ggplot(subset(red_ca_B, Env=="N" & FocalSR==1 & Type=="INTRA"), aes(y=GrowthRateOA, x=Dens_Focal))+
  facet_grid(.~Replicate)+
  geom_point(position=position_dodge2(0.5))+
  geom_line(aes(y=pred, x=Dens_Focal))+
 geom_ribbon(aes(ymin=pred_L, ymax=pred_U), fill="lightgrey", linetype="dashed", colour="black")+
  ylab("Growth rate")+
  xlab("Density")+
  ggtitle("Normal environment Control urticae Intra")


ggplot(subset(red_ca_B, Env=="N" & FocalSR==1 & Type=="INTER" & CompSR=="4"), aes(y=GrowthRateOA, x=Dens_Comp))+
  facet_grid(.~Replicate)+
  geom_point(position=position_dodge2(0.5))+
  geom_abline(data=subset(param_all_B,Tu_Regime=="SR1" & Environment=="N"  & Te_Regime=="SR4"), aes(slope=-Tu_inter, intercept = Tu_lambda))+
  ylab("Growth rate")+
  xlab("Density")+
  ggtitle("Normal environment Control urticae Inter Control")


ggplot(subset(red_ca_B, Env=="N" & FocalSR==1 & Type=="INTER" & CompSR=="5"), aes(y=GrowthRateOA, x=Dens_Comp))+
  facet_grid(.~Replicate)+
  geom_point(position=position_dodge2(0.5))+
  geom_abline(data=subset(param_all_B,Tu_Regime=="SR1" & Environment=="N"  & Te_Regime=="SR5"), aes(slope=-Tu_inter, intercept = Tu_lambda))+
  ylab("Growth rate")+
  xlab("Density")+
  ggtitle("Normal environment Control urticae Inter Evolved")

NA
NA

C - CXR nested

To do this we have to trick the cxr (Oscar suggestion), by putting the intraspecific competitors in another column than the focal and then estimate only intra!

normal
dir.create("./NewAnalyses/cxr_lambda_fixed_nested", showWarnings = FALSE)

# modifying data frame to fit the type of setup that is need for CXR
CXR_C_N<-subset(ca, Env=="N")[,c("Rep", "FocalSR", "CompSR", "Dens", "TeFemales", "TuFemales")]

CXR_C_N$Focal<-mapvalues(CXR_C_N$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))
CXR_C_N$CompSR2<-mapvalues(CXR_C_N$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))

CXR_C_N$Comp<-sapply(c(1:length(CXR_C_N[,1])), function(x){
  if(is.na(CXR_C_N$CompSR2[x])){
    a<- CXR_C_N$Focal[x]
  }else{
    a<-CXR_C_N$CompSR2[x]
  }
  
  a
})

aux<-data.frame(SR1=rep(0, length(CXR_C_N[,1])), SR2=rep(0, length(CXR_C_N[,1])), SR4=rep(0, length(CXR_C_N[,1])), SR5=rep(0, length(CXR_C_N[,1])))

for(i in 1:length(CXR_C_N[,1])){
  #coluna onde por focais
  colunaF<-which(colnames(aux)==CXR_C_N$Focal[i])
  #coluna onde por competidors
  colunaC<-which(colnames(aux)==CXR_C_N$Comp[i])
  
  #if its the same regime
  if(CXR_C_N$Focal[i]==CXR_C_N$Comp[i] & CXR_C_N$Dens[i]==1){
    aux[i,colunaF]<-CXR_C_N$Dens[i]-1
    
  }else if(CXR_C_N$Focal[i]==CXR_C_N$Comp[i]){
    aux[i,colunaF]<-CXR_C_N$Dens[i]-1
  }else{ #if it is heterospecific then its -1 for the competitors (because of the focal) and its one for the focal
    aux[i,colunaC]<-CXR_C_N$Dens[i]-1
    aux[i, colunaF]<-1
  }
  
}

CXR_C_N<-cbind(CXR_C_N, aux)

CXR_C_N$fitness<-sapply(c(1:length(CXR_C_N[,1])), function(x){
  colF<-which(colnames(CXR_C_N)==CXR_C_N$Focal[x])
  
  if(CXR_C_N$Focal[x]=="SR1"){
    a<-CXR_C_N$TuFemales[x]/CXR_C_N$SR1[x]
  } else if(CXR_C_N$Focal[x]=="SR2"){
    a<-CXR_C_N$TuFemales[x]/CXR_C_N$SR2[x]
  } else if(CXR_C_N$Focal[x]=="SR4"){
    a<-CXR_C_N$TeFemales[x]/CXR_C_N$SR4[x]
  } else if(CXR_C_N$Focal[x]=="SR5"){
    a<-CXR_C_N$TeFemales[x]/CXR_C_N$SR5[x]
  }
  
  a
})

#removing rows for which there is no data for fitness
CXR_C_N<-CXR_C_N[-which(is.na(CXR_C_N$fitness)),]

# adding +1 to all data
#CXR_C_N$fitness<-CXR_C_N$fitness+1

CXR_C_N[which(CXR_C_N$fitness=="-Inf" | CXR_C_N$fitness=="Inf"),"fitness"]<-0


# all data gets +1 because of the 0 problem
CXR_C_N$fitness<-CXR_C_N$fitness+1

# vector that tells which are the selection regimes, the columns have to have the same name
my.reg <- c("SR1", "SR2","SR4","SR5")
str(CXR_C_N)
'data.frame':   1637 obs. of  14 variables:
 $ Rep      : int  1 1 1 1 1 1 1 1 1 1 ...
 $ FocalSR  : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens     : int  1 1 2 2 4 4 10 10 1 1 ...
 $ TeFemales: int  6 9 2 10 9 6 13 48 11 13 ...
 $ TuFemales: int  NA NA NA NA NA NA NA NA NA NA ...
 $ Focal    : chr  "SR4" "SR4" "SR4" "SR4" ...
 $ CompSR2  : chr  NA NA NA NA ...
 $ Comp     : chr  "SR4" "SR4" "SR4" "SR4" ...
 $ SR1      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ SR2      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ SR4      : num  0 0 1 1 3 3 9 9 0 0 ...
 $ SR5      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ fitness  : num  1 1 3 11 4 ...
# Do list per replicate and environment
R1_intra<-list(SR1= subset(CXR_C_N, Rep==1 & Focal=="SR1" & Comp=="SR1")[,c("fitness", "SR1")], SR2= subset(CXR_C_N, Rep==1 & Focal=="SR2" & Comp=="SR2")[,c("fitness",  "SR2")], SR4= subset(CXR_C_N, Rep==1 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_N, Rep==1 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])

R2_intra<-list(SR1= subset(CXR_C_N, Rep==2 & Focal=="SR1" & Comp=="SR1" )[,c("fitness", "SR1")], SR4= subset(CXR_C_N, Rep==2 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_N, Rep==2 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])

R3_intra<-list(SR1= subset(CXR_C_N, Rep==3 & Focal=="SR1" & Comp=="SR1" )[,c("fitness", "SR1")], SR2= subset(CXR_C_N, Rep==3 & Focal=="SR2" & Comp=="SR2")[,c("fitness",  "SR2")], SR4= subset(CXR_C_N, Rep==3 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_N, Rep==3 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])

R4_intra<-list(SR1= subset(CXR_C_N, Rep==4 & Focal=="SR1" & Comp=="SR1" )[,c("fitness", "SR1")], SR2= subset(CXR_C_N, Rep==4 & Focal=="SR2" & Comp=="SR2")[,c("fitness",  "SR2")], SR4= subset(CXR_C_N, Rep==4 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_N, Rep==4 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])

R5_intra<-list(SR1= subset(CXR_C_N, Rep==5 & Focal=="SR1" & Comp=="SR1" )[,c("fitness", "SR1")], SR2= subset(CXR_C_N, Rep==5 & Focal=="SR2" & Comp=="SR2")[,c("fitness",  "SR2")], SR4= subset(CXR_C_N, Rep==5 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_N, Rep==5 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])



####################################
######## DOING THE INTRA ESTIMATES
###################################


cxr_C.R1_intra<-cxr_pm_multifit(data = R1_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_1N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R2_intra<-cxr_pm_multifit(data = R2_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R3_intra<-cxr_pm_multifit(data = R3_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_3N,
                           # no standard errors
                           bootstrap_samples = 200)
Warning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs produced
cxr_C.R4_intra<-cxr_pm_multifit(data = R4_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_4N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R5_intra<-cxr_pm_multifit(data = R5_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_5N,
                           # no standard errors
                           bootstrap_samples = 200)

summary(cxr_C.R1_intra)
model: 'RK_pm_alpha_global_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
        alpha
SR1 0.1091347
SR2 0.0764843
SR4 0.1439655
SR5 0.1236622
#################
######Doing the inter estimates
##################

R1<-list(SR1= subset(CXR_C_N, Rep==1 & Focal=="SR1" & Comp!="SR1")[,c("fitness", "SR4", "SR5")], SR2= subset(CXR_C_N, Rep==1 & Focal=="SR2"& Comp!="SR2")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_N, Rep==1 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1", "SR2")], SR5= subset(CXR_C_N, Rep==1 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1", "SR2")])

R2<-list(SR1= subset(CXR_C_N, Rep==2 & Focal=="SR1" & Comp!="SR1")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_N, Rep==2 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1")], SR5= subset(CXR_C_N, Rep==2 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1")])

R3<-list(SR1= subset(CXR_C_N, Rep==3 & Focal=="SR1" & Comp!="SR1")[,c("fitness",  "SR4", "SR5")], SR2= subset(CXR_C_N, Rep==3 & Focal=="SR2" & Comp!="SR2")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_N, Rep==3 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1", "SR2")], SR5= subset(CXR_C_N, Rep==3 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1", "SR2")])

R4<-list(SR1= subset(CXR_C_N, Rep==4 & Focal=="SR1" & Comp!="SR1")[,c("fitness",  "SR4", "SR5")], SR2= subset(CXR_C_N, Rep==4 & Focal=="SR2" & Comp!="SR2")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_N, Rep==4 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1", "SR2")], SR5= subset(CXR_C_N, Rep==4 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1", "SR2")])

R5<-list(SR1= subset(CXR_C_N, Rep==5 & Focal=="SR1" & Comp!="SR1")[,c("fitness", "SR4", "SR5")], SR2= subset(CXR_C_N, Rep==5 & Focal=="SR2" & Comp!="SR2")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_N, Rep==5 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1", "SR2")], SR5= subset(CXR_C_N, Rep==5 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1", "SR2")])




cxr_C.R1<-cxr_pm_multifit(data = R1,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_1N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R2_sr1<-cxr_pm_fit(data = R2[[1]],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2N[[1]],
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R2_sr4<-cxr_pm_fit(data = R2[[2]],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2N[[2]],
                           # no standard errors
                           bootstrap_samples = 200)



cxr_C.R2_sr5<-cxr_pm_fit(data = R2[[3]],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_2N[[3]],
                           # no standard errors
                           bootstrap_samples = 200)


cxr_C.R3<-cxr_pm_multifit(data = R3,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_3N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R4<-cxr_pm_multifit(data = R4,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_4N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R5<-cxr_pm_multifit(data = R5,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_5N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R2_intra$alpha_matrix
         alpha
SR1 0.10677055
SR4 0.06945784
SR5 0.14419887
cadmium
# modifying data frame to fit the type of setup that is need for CXR
CXR_C_Cd<-subset(ca, Env=="Cd")[,c("Rep", "FocalSR", "CompSR", "Dens", "TeFemales", "TuFemales")]

CXR_C_Cd$Focal<-mapvalues(CXR_C_Cd$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))
CXR_C_Cd$CompSR2<-mapvalues(CXR_C_Cd$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))

CXR_C_Cd$Comp<-sapply(c(1:length(CXR_C_Cd[,1])), function(x){
  if(is.na(CXR_C_Cd$CompSR2[x])){
    a<- CXR_C_Cd$Focal[x]
  }else{
    a<-CXR_C_Cd$CompSR2[x]
  }
  
  a
})

aux<-data.frame(SR1=rep(0, length(CXR_C_Cd[,1])), SR2=rep(0, length(CXR_C_Cd[,1])), SR4=rep(0, length(CXR_C_Cd[,1])), SR5=rep(0, length(CXR_C_Cd[,1])))

for(i in 1:length(CXR_C_Cd[,1])){
  #coluna onde por focais
  colunaF<-which(colnames(aux)==CXR_C_Cd$Focal[i])
  #coluna onde por competidors
  colunaC<-which(colnames(aux)==CXR_C_Cd$Comp[i])
  
  #if its the same regime
  if(CXR_C_Cd$Focal[i]==CXR_C_Cd$Comp[i] & CXR_C_Cd$Dens[i]==1){
    aux[i,colunaF]<-CXR_C_Cd$Dens[i]-1
    
  }else if(CXR_C_Cd$Focal[i]==CXR_C_Cd$Comp[i]){
    aux[i,colunaF]<-CXR_C_Cd$Dens[i]-1
  }else{ #if it is heterospecific then its -1 for the competitors (because of the focal) and its one for the focal
    aux[i,colunaC]<-CXR_C_Cd$Dens[i]-1
    aux[i, colunaF]<-1
  }
  
}

CXR_C_Cd<-cbind(CXR_C_Cd, aux)

CXR_C_Cd$fitness<-sapply(c(1:length(CXR_C_Cd[,1])), function(x){
  colF<-which(colnames(CXR_C_Cd)==CXR_C_Cd$Focal[x])
  
  if(CXR_C_Cd$Focal[x]=="SR1"){
    a<-CXR_C_Cd$TuFemales[x]/CXR_C_Cd$SR1[x]
  } else if(CXR_C_Cd$Focal[x]=="SR2"){
    a<-CXR_C_Cd$TuFemales[x]/CXR_C_Cd$SR2[x]
  } else if(CXR_C_Cd$Focal[x]=="SR4"){
    a<-CXR_C_Cd$TeFemales[x]/CXR_C_Cd$SR4[x]
  } else if(CXR_C_Cd$Focal[x]=="SR5"){
    a<-CXR_C_Cd$TeFemales[x]/CXR_C_Cd$SR5[x]
  }
  
  a
})

#removing rows for which there is no data for fitness
CXR_C_Cd<-CXR_C_Cd[-which(is.na(CXR_C_Cd$fitness)),]

# adding +1 to all data
#CXR_C_Cd$fitness<-CXR_C_Cd$fitness+1

CXR_C_Cd[which(CXR_C_Cd$fitness=="-Inf" | CXR_C_Cd$fitness=="Inf"),"fitness"]<-0


# all data gets +1 because of the 0 problem
CXR_C_Cd$fitness<-CXR_C_Cd$fitness+1

# vector that tells which are the selection regimes, the columns have to have the same name
my.reg <- c("SR1", "SR2","SR4","SR5")
str(CXR_C_Cd)
'data.frame':   1585 obs. of  14 variables:
 $ Rep      : int  1 1 1 1 1 1 1 1 1 1 ...
 $ FocalSR  : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens     : int  1 1 2 2 4 4 10 10 1 1 ...
 $ TeFemales: int  2 5 4 4 0 0 7 3 2 1 ...
 $ TuFemales: int  NA NA NA NA NA NA NA NA NA NA ...
 $ Focal    : chr  "SR4" "SR4" "SR4" "SR4" ...
 $ CompSR2  : chr  NA NA NA NA ...
 $ Comp     : chr  "SR4" "SR4" "SR4" "SR4" ...
 $ SR1      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ SR2      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ SR4      : num  0 0 1 1 3 3 9 9 0 0 ...
 $ SR5      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ fitness  : num  1 1 5 5 1 ...
# Do list per replicate and environment
R1_cd_intra<-list(SR1= subset(CXR_C_Cd, Rep==1 & Focal=="SR1" & Comp=="SR1")[,c("fitness", "SR1")], SR2= subset(CXR_C_Cd, Rep==1 & Focal=="SR2" & Comp=="SR2")[,c("fitness",  "SR2")], SR4= subset(CXR_C_Cd, Rep==1 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_Cd, Rep==1 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])

R2_cd_intra<-list(SR1= subset(CXR_C_Cd, Rep==2 & Focal=="SR1" & Comp=="SR1" )[,c("fitness", "SR1")], SR4= subset(CXR_C_Cd, Rep==2 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_Cd, Rep==2 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])

R3_cd_intra<-list(SR1= subset(CXR_C_Cd, Rep==3 & Focal=="SR1" & Comp=="SR1" )[,c("fitness", "SR1")], SR2= subset(CXR_C_Cd, Rep==3 & Focal=="SR2" & Comp=="SR2")[,c("fitness",  "SR2")], SR4= subset(CXR_C_Cd, Rep==3 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_Cd, Rep==3 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])

R4_cd_intra<-list(SR1= subset(CXR_C_Cd, Rep==4 & Focal=="SR1" & Comp=="SR1" )[,c("fitness", "SR1")], SR2= subset(CXR_C_Cd, Rep==4 & Focal=="SR2" & Comp=="SR2")[,c("fitness",  "SR2")], SR4= subset(CXR_C_Cd, Rep==4 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_Cd, Rep==4 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])

R5_cd_intra<-list(SR1= subset(CXR_C_Cd, Rep==5 & Focal=="SR1" & Comp=="SR1" )[,c("fitness", "SR1")], SR2= subset(CXR_C_Cd, Rep==5 & Focal=="SR2" & Comp=="SR2")[,c("fitness",  "SR2")], SR4= subset(CXR_C_Cd, Rep==5 & Focal=="SR4" & Comp=="SR4")[,c("fitness",  "SR4")], SR5= subset(CXR_C_Cd, Rep==5 & Focal=="SR5" & Comp=="SR5")[,c("fitness", "SR5")])


#### lambda

fixed_terms_C_1N <- list(list(lambda = subset(mean_dens1, Rep==1 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="Cd" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==1 & Env=="Cd" & SR==5)$lambda))

fixed_terms_C_2N <- list(list(lambda = subset(mean_dens1, Rep==2 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==2 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==2 & Env=="Cd" & SR==5)$lambda))

fixed_terms_C_3N <- list(list(lambda = subset(mean_dens1, Rep==3 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="Cd" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==3 & Env=="Cd" & SR==5)$lambda))

fixed_terms_C_4N <- list(list(lambda = subset(mean_dens1, Rep==4 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="Cd" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==4 & Env=="Cd" & SR==5)$lambda))

fixed_terms_C_5N <- list(list(lambda = subset(mean_dens1, Rep==5 & Env=="Cd" & SR==1)$lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="Cd" & SR==2)$lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="Cd" & SR==4)$lambda),
                    list(lambda= subset(mean_dens1, Rep==5 & Env=="Cd" & SR==5)$lambda))

####################################
######## DOING THE INTRA ESTIMATES
###################################


cxr_C.R1_cd_intra<-cxr_pm_multifit(data = R1_cd_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_1N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R2_cd_intra<-cxr_pm_multifit(data = R2_cd_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_2N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R3_cd_intra<-cxr_pm_multifit(data = R3_cd_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_3N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R4_cd_intra<-cxr_pm_multifit(data = R4_cd_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_4N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R5_cd_intra<-cxr_pm_multifit(data = R5_cd_intra,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_5N,
                           # no standard errors
                           bootstrap_samples = 200)


summary(cxr_C.R1_cd_intra)
model: 'RK_pm_alpha_global_lambdacov_none_alphacov_none'
optimization method: 'Nelder-Mead'
----------

----------
alpha matrix:
         alpha
SR1 0.03859441
SR2 0.06428340
SR4 0.09173854
SR5 0.14814401
#################
######Doing the inter estimates
##################

R1_cd<-list(SR1= subset(CXR_C_Cd, Rep==1 & Focal=="SR1" & Comp!="SR1")[,c("fitness", "SR4", "SR5")], SR2= subset(CXR_C_Cd, Rep==1 & Focal=="SR2"& Comp!="SR2")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_Cd, Rep==1 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1", "SR2")], SR5= subset(CXR_C_Cd, Rep==1 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1", "SR2")])

R2_cd<-list(SR1= subset(CXR_C_Cd, Rep==2 & Focal=="SR1" & Comp!="SR1")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_Cd, Rep==2 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1")], SR5= subset(CXR_C_Cd, Rep==2 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1")])

R3_cd<-list(SR1= subset(CXR_C_Cd, Rep==3 & Focal=="SR1" & Comp!="SR1")[,c("fitness",  "SR4", "SR5")], SR2= subset(CXR_C_Cd, Rep==3 & Focal=="SR2" & Comp!="SR2")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_Cd, Rep==3 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1", "SR2")], SR5= subset(CXR_C_Cd, Rep==3 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1", "SR2")])

R4_cd<-list(SR1= subset(CXR_C_Cd, Rep==4 & Focal=="SR1" & Comp!="SR1")[,c("fitness",  "SR4", "SR5")], SR2= subset(CXR_C_Cd, Rep==4 & Focal=="SR2" & Comp!="SR2")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_Cd, Rep==4 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1", "SR2")], SR5= subset(CXR_C_Cd, Rep==4 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1", "SR2")])

R5_cd<-list(SR1= subset(CXR_C_Cd, Rep==5 & Focal=="SR1" & Comp!="SR1")[,c("fitness", "SR4", "SR5")], SR2= subset(CXR_C_Cd, Rep==5 & Focal=="SR2" & Comp!="SR2")[,c("fitness", "SR4", "SR5")], SR4= subset(CXR_C_Cd, Rep==5 & Focal=="SR4" & Comp!="SR4")[,c("fitness", "SR1", "SR2")], SR5= subset(CXR_C_Cd, Rep==5 & Focal=="SR5" & Comp!="SR5")[,c("fitness", "SR1", "SR2")])




cxr_C.R1_cd<-cxr_pm_multifit(data = R1_cd,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_1N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R2_cd_sr1<-cxr_pm_fit(data = R2_cd[[1]],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_2N[[1]],
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R2_cd_sr4<-cxr_pm_fit(data = R2_cd[[2]],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_2N[[2]],
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R2_cd_sr5<-cxr_pm_fit(data = R2_cd[[3]],
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "global",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_2N[[3]],
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R3_cd<-cxr_pm_multifit(data = R3_cd,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_3N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R4_cd<-cxr_pm_multifit(data = R4_cd,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_4N,
                           # no standard errors
                           bootstrap_samples = 200)

cxr_C.R5_cd<-cxr_pm_multifit(data = R5_cd,
                           focal_column = NULL,
                           model_family = "RK",
                           covariates = NULL,
                          optimization_method = "Nelder-Mead",
                          alpha_form = "pairwise",
                          lambda_cov_form = "none",
                          alpha_cov_form = "none",
                         initial_values = list(alpha_inter = 0.1),
                          fixed_terms = fixed_terms_C_5N,
                           # no standard errors
                           bootstrap_samples = 200)



cxr_C.R1_cd$alpha_matrix
           SR1        SR2        SR4        SR5
SR1         NA         NA 0.06242575 0.05005673
SR2         NA         NA 0.05033948 0.05637467
SR4 0.05321877 0.08501578         NA         NA
SR5 0.13982261 0.11477131         NA         NA

rows in the alpha element of the returning list correspond to species i and columns to species j for each αij coefficient.

data table summary water

cxr_param_C<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("N"))
cxr_param_C$Tu_lambda<-0
cxr_param_C$Te_lambda<-0
cxr_param_C$Tu_intra<-0
cxr_param_C$Te_intra<-0
cxr_param_C$Tu_inter<-0
cxr_param_C$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_C<-cxr_param_C[-which(cxr_param_C$Replicate==2 & cxr_param_C$Tu_Regime=="SR2"),]


cxr_param_C[which(cxr_param_C$Replicate==1),"Tu_lambda"]<-c(cxr_C.R1_intra$fixed_terms[[1]]$lambda,cxr_C.R1_intra$fixed_terms[[2]]$lambda)
cxr_param_C[which(cxr_param_C$Replicate==1),"Te_lambda"]<-c(cxr_C.R1_intra$fixed_terms[[3]]$lambda,cxr_C.R1_intra$fixed_terms[[3]]$lambda, cxr_C.R1_intra$fixed_terms[[4]]$lambda,cxr_C.R1_intra$fixed_terms[[4]]$lambda)

cxr_param_C[which(cxr_param_C$Replicate==2),"Tu_lambda"]<-c(cxr_C.R2_intra$fixed_terms[[1]]$lambda,cxr_C.R2_intra$fixed_terms[[1]]$lambda)
cxr_param_C[which(cxr_param_C$Replicate==2),"Te_lambda"]<-c(cxr_C.R2_intra$fixed_terms[[2]]$lambda,cxr_C.R2_intra$fixed_terms[[3]]$lambda)

cxr_param_C[which(cxr_param_C$Replicate==3),"Tu_lambda"]<-c(cxr_C.R3_intra$fixed_terms[[1]]$lambda,cxr_C.R3_intra$fixed_terms[[2]]$lambda)
cxr_param_C[which(cxr_param_C$Replicate==3),"Te_lambda"]<-c(cxr_C.R3_intra$fixed_terms[[3]]$lambda,cxr_C.R3_intra$fixed_terms[[3]]$lambda, cxr_C.R3_intra$fixed_terms[[4]]$lambda,cxr_C.R3_intra$fixed_terms[[4]]$lambda)

cxr_param_C[which(cxr_param_C$Replicate==4),"Tu_lambda"]<-c(cxr_C.R4_intra$fixed_terms[[1]]$lambda,cxr_C.R4_intra$fixed_terms[[2]]$lambda)
cxr_param_C[which(cxr_param_C$Replicate==4),"Te_lambda"]<-c(cxr_C.R4_intra$fixed_terms[[3]]$lambda,cxr_C.R4_intra$fixed_terms[[3]]$lambda, cxr_C.R4_intra$fixed_terms[[4]]$lambda,cxr_C.R4_intra$fixed_terms[[4]]$lambda)

cxr_param_C[which(cxr_param_C$Replicate==5),"Tu_lambda"]<-c(cxr_C.R5_intra$fixed_terms[[1]]$lambda,cxr_C.R5_intra$fixed_terms[[2]]$lambda)
cxr_param_C[which(cxr_param_C$Replicate==5),"Te_lambda"]<-c(cxr_C.R5_intra$fixed_terms[[3]]$lambda,cxr_C.R5_intra$fixed_terms[[3]]$lambda, cxr_C.R5_intra$fixed_terms[[4]]$lambda,cxr_C.R5_intra$fixed_terms[[4]]$lambda)


cxr_param_C[which(cxr_param_C$Replicate==1),"Tu_intra"]<-rep(c(cxr_C.R1_intra$alpha_matrix[1,1], cxr_C.R1_intra$alpha_matrix[2,1]), 2)
cxr_param_C[which(cxr_param_C$Replicate==1),"Te_intra"]<-rep(c(cxr_C.R1_intra$alpha_matrix[3,1], cxr_C.R1_intra$alpha_matrix[4,1]), each=2)

cxr_param_C[which(cxr_param_C$Replicate==2),"Tu_intra"]<-rep(c(cxr_C.R2_intra$alpha_matrix[1,1]), 2)
cxr_param_C[which(cxr_param_C$Replicate==2),"Te_intra"]<-rep(c(cxr_C.R2_intra$alpha_matrix[2,1], cxr_C.R2_intra$alpha_matrix[3,1]))

cxr_param_C[which(cxr_param_C$Replicate==3),"Tu_intra"]<-rep(c(cxr_C.R3_intra$alpha_matrix[1,1], cxr_C.R3_intra$alpha_matrix[2,1]), 2)
cxr_param_C[which(cxr_param_C$Replicate==3),"Te_intra"]<-rep(c(cxr_C.R3_intra$alpha_matrix[3,1], cxr_C.R3_intra$alpha_matrix[4,1]), each=2)

cxr_param_C[which(cxr_param_C$Replicate==4),"Tu_intra"]<-rep(c(cxr_C.R4_intra$alpha_matrix[1,1], cxr_C.R4_intra$alpha_matrix[2,1]), 2)
cxr_param_C[which(cxr_param_C$Replicate==4),"Te_intra"]<-rep(c(cxr_C.R4_intra$alpha_matrix[3,1], cxr_C.R4_intra$alpha_matrix[4,1]), each=2)

cxr_param_C[which(cxr_param_C$Replicate==5),"Tu_intra"]<-rep(c(cxr_C.R5_intra$alpha_matrix[1,1], cxr_C.R5_intra$alpha_matrix[2,1]), 2)
cxr_param_C[which(cxr_param_C$Replicate==5),"Te_intra"]<-rep(c(cxr_C.R5_intra$alpha_matrix[3,1], cxr_C.R5_intra$alpha_matrix[4,1]), each=2)


cxr_param_C[which(cxr_param_C$Replicate==1),"Tu_inter"]<-c(cxr_C.R1$alpha_matrix[1,3], cxr_C.R1$alpha_matrix[2,3],cxr_C.R1$alpha_matrix[1,4], cxr_C.R1$alpha_matrix[2,4])
cxr_param_C[which(cxr_param_C$Replicate==1),"Te_inter"]<-c(cxr_C.R1$alpha_matrix[3,1], cxr_C.R1$alpha_matrix[3,2],cxr_C.R1$alpha_matrix[4,1], cxr_C.R1$alpha_matrix[4,2])

cxr_param_C[which(cxr_param_C$Replicate==2),"Tu_inter"]<-c(cxr_C.R2_sr1$alpha_inter[1], cxr_C.R2_sr1$alpha_inter[2])
cxr_param_C[which(cxr_param_C$Replicate==2),"Te_inter"]<-c(cxr_C.R2_sr4$alpha_inter[1],cxr_C.R2_sr1$alpha_inter[1])

cxr_param_C[which(cxr_param_C$Replicate==3),"Tu_inter"]<-c(cxr_C.R3$alpha_matrix[1,3], cxr_C.R3$alpha_matrix[2,3],cxr_C.R3$alpha_matrix[1,4], cxr_C.R3$alpha_matrix[2,4])
cxr_param_C[which(cxr_param_C$Replicate==3),"Te_inter"]<-c(cxr_C.R3$alpha_matrix[3,1], cxr_C.R3$alpha_matrix[3,2],cxr_C.R3$alpha_matrix[4,1], cxr_C.R3$alpha_matrix[4,2])

cxr_param_C[which(cxr_param_C$Replicate==4),"Tu_inter"]<-c(cxr_C.R4$alpha_matrix[1,3], cxr_C.R4$alpha_matrix[2,3],cxr_C.R4$alpha_matrix[1,4], cxr_C.R4$alpha_matrix[2,4])
cxr_param_C[which(cxr_param_C$Replicate==4),"Te_inter"]<-c(cxr_C.R4$alpha_matrix[3,1], cxr_C.R4$alpha_matrix[3,2],cxr_C.R4$alpha_matrix[4,1], cxr_C.R4$alpha_matrix[4,2])

cxr_param_C[which(cxr_param_C$Replicate==5),"Tu_inter"]<-c(cxr_C.R5$alpha_matrix[1,3], cxr_C.R5$alpha_matrix[2,3],cxr_C.R5$alpha_matrix[1,4], cxr_C.R5$alpha_matrix[2,4])
cxr_param_C[which(cxr_param_C$Replicate==5),"Te_inter"]<-c(cxr_C.R5$alpha_matrix[3,1], cxr_C.R5$alpha_matrix[3,2],cxr_C.R5$alpha_matrix[4,1], cxr_C.R5$alpha_matrix[4,2])

### Lower

cxr_param_C_lower<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("N"))
cxr_param_C_lower$Tu_lambda<-0
cxr_param_C_lower$Te_lambda<-0
cxr_param_C_lower$Tu_intra<-0
cxr_param_C_lower$Te_intra<-0
cxr_param_C_lower$Tu_inter<-0
cxr_param_C_lower$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_C_lower<-cxr_param_C_lower[-which(cxr_param_C_lower$Replicate==2 & cxr_param_C_lower$Tu_Regime=="SR2"),]

#Since the error comes directly from the data we need to create some lists with that information
sd_1N <- list(list(lambda = subset(mean_dens1, Rep==1 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="N" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==1 & Env=="N" & SR==5)$sd_lambda))

sd_2N <- list(list(lambda = subset(mean_dens1, Rep==2 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==2 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==2 & Env=="N" & SR==5)$sd_lambda))

sd_3N <- list(list(lambda = subset(mean_dens1, Rep==3 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="N" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==3 & Env=="N" & SR==5)$sd_lambda))

sd_4N <- list(list(lambda = subset(mean_dens1, Rep==4 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="N" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==4 & Env=="N" & SR==5)$sd_lambda))

sd_5N <- list(list(lambda = subset(mean_dens1, Rep==5 & Env=="N" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="N" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="N" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==5 & Env=="N" & SR==5)$sd_lambda))

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==1),"Tu_lambda"]<-c(cxr_C.R1$fixed_terms[[1]]$lambda-sd_1N[[1]]$lambda,cxr_C.R1$fixed_terms[[2]]$lambda-sd_1N[[2]]$lambda)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==1),"Te_lambda"]<-c(cxr_C.R1$fixed_terms[[3]]$lambda-sd_1N[[3]]$lambda,cxr_C.R1$fixed_terms[[3]]$lambda-sd_1N[[3]]$lambda, cxr_C.R1$fixed_terms[[4]]$lambda-sd_1N[[4]]$lambda,cxr_C.R1$fixed_terms[[4]]$lambda-sd_1N[[4]]$lambda)

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==2),"Tu_lambda"]<-c(cxr_C.R2_sr1$fixed_terms[[1]]-sd_2N[[1]]$lambda,cxr_C.R2_sr1$fixed_terms[[1]]-sd_2N[[1]]$lambda)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==2),"Te_lambda"]<-c(cxr_C.R2_sr4$fixed_terms[[1]]-sd_2N[[2]]$lambda,cxr_C.R2_sr5$fixed_terms[[1]]-sd_2N[[3]]$lambda)

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==3),"Tu_lambda"]<-c(cxr_C.R3$fixed_terms[[1]]$lambda-sd_3N[[1]]$lambda,cxr_C.R3$fixed_terms[[2]]$lambda-sd_3N[[2]]$lambda)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==3),"Te_lambda"]<-c(cxr_C.R3$fixed_terms[[3]]$lambda-sd_3N[[3]]$lambda,cxr_C.R3$fixed_terms[[3]]$lambda-sd_3N[[3]]$lambda, cxr_C.R3$fixed_terms[[4]]$lambda-sd_3N[[4]]$lambda,cxr_C.R3$fixed_terms[[4]]$lambda-sd_3N[[4]]$lambda)

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==4),"Tu_lambda"]<-c(cxr_C.R4$fixed_terms[[1]]$lambda-sd_4N[[1]]$lambda,cxr_C.R4$fixed_terms[[2]]$lambda-sd_4N[[2]]$lambda)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==4),"Te_lambda"]<-c(cxr_C.R4$fixed_terms[[3]]$lambda-sd_4N[[3]]$lambda,cxr_C.R4$fixed_terms[[3]]$lambda-sd_4N[[3]]$lambda, cxr_C.R4$fixed_terms[[4]]$lambda-sd_4N[[4]]$lambda,cxr_C.R4$fixed_terms[[4]]$lambda-sd_4N[[4]]$lambda)

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==5),"Tu_lambda"]<-c(cxr_C.R5$fixed_terms[[1]]$lambda-sd_5N[[1]]$lambda,cxr_C.R5$fixed_terms[[2]]$lambda-sd_5N[[2]]$lambda)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==5),"Te_lambda"]<-c(cxr_C.R5$fixed_terms[[3]]$lambda-sd_5N[[3]]$lambda,cxr_C.R5$fixed_terms[[3]]$lambda-sd_5N[[3]]$lambda, cxr_C.R5$fixed_terms[[4]]$lambda-sd_5N[[4]]$lambda,cxr_C.R5$fixed_terms[[4]]$lambda-sd_5N[[4]]$lambda)


cxr_param_C_lower[which(cxr_param_C_lower$Replicate==1),"Tu_intra"]<-rep(c(cxr_C.R1_intra$alpha_matrix[1,1]-cxr_C.R1_intra$alpha_matrix_standard_error[1,1], cxr_C.R1_intra$alpha_matrix[2,1]-cxr_C.R1_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==1),"Te_intra"]<-rep(c(cxr_C.R1_intra$alpha_matrix[3,1]-cxr_C.R1_intra$alpha_matrix_standard_error[3,1], cxr_C.R1_intra$alpha_matrix[4,1]-cxr_C.R1_intra$alpha_matrix_standard_error[4,1]), each=2)

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==2),"Tu_intra"]<-rep(c(cxr_C.R2_intra$alpha_matrix[1,1]-cxr_C.R2_intra$alpha_matrix_standard_error[1,1]), 2)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==2),"Te_intra"]<-c(cxr_C.R2_intra$alpha_matrix[2,1]-cxr_C.R2_intra$alpha_matrix_standard_error[2,1], cxr_C.R2_intra$alpha_matrix[3,1]-cxr_C.R2_intra$alpha_matrix_standard_error[3,1])

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==3),"Tu_intra"]<-rep(c(cxr_C.R3_intra$alpha_matrix[1,1]-cxr_C.R3_intra$alpha_matrix_standard_error[1,1], cxr_C.R3_intra$alpha_matrix[2,1]-cxr_C.R3_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==3),"Te_intra"]<-rep(c(cxr_C.R3_intra$alpha_matrix[3,1]-cxr_C.R3_intra$alpha_matrix_standard_error[3,1], cxr_C.R3_intra$alpha_matrix[4,1]-cxr_C.R3_intra$alpha_matrix_standard_error[4,1]), each=2)

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==4),"Tu_intra"]<-rep(c(cxr_C.R4_intra$alpha_matrix[1,1]-cxr_C.R4_intra$alpha_matrix_standard_error[1,1], cxr_C.R4_intra$alpha_matrix[2,1]-cxr_C.R4_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==4),"Te_intra"]<-rep(c(cxr_C.R4_intra$alpha_matrix[3,1]-cxr_C.R4_intra$alpha_matrix_standard_error[3,1], cxr_C.R4_intra$alpha_matrix[4,1]-cxr_C.R4_intra$alpha_matrix_standard_error[4,1]), each=2)

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==5),"Tu_intra"]<-rep(c(cxr_C.R5_intra$alpha_matrix[1,1]-cxr_C.R5_intra$alpha_matrix_standard_error[1,1], cxr_C.R5_intra$alpha_matrix[2,1]-cxr_C.R5_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==5),"Te_intra"]<-rep(c(cxr_C.R5_intra$alpha_matrix[3,1]-cxr_C.R5_intra$alpha_matrix_standard_error[3,1], cxr_C.R5_intra$alpha_matrix[4,1]-cxr_C.R5_intra$alpha_matrix_standard_error[4,1]), each=2)


cxr_param_C_lower[which(cxr_param_C_lower$Replicate==1),"Tu_inter"]<-c(cxr_C.R1$alpha_matrix[1,3]-cxr_C.R1$alpha_matrix_standard_error[1,3], cxr_C.R1$alpha_matrix[2,3]-cxr_C.R1$alpha_matrix_standard_error[2,3],cxr_C.R1$alpha_matrix[1,4]-cxr_C.R1$alpha_matrix_standard_error[1,4], cxr_C.R1$alpha_matrix[2,4]-cxr_C.R1$alpha_matrix_standard_error[2,4])
cxr_param_C_lower[which(cxr_param_C_lower$Replicate==1),"Te_inter"]<-c(cxr_C.R1$alpha_matrix[3,1]-cxr_C.R1$alpha_matrix_standard_error[3,1], cxr_C.R1$alpha_matrix[3,2]-cxr_C.R1$alpha_matrix_standard_error[3,2],cxr_C.R1$alpha_matrix[4,1]-cxr_C.R1$alpha_matrix_standard_error[4,1], cxr_C.R1$alpha_matrix[4,2]-cxr_C.R1$alpha_matrix_standard_error[4,2])

cxr_param_C_lower[which(cxr_param_C_lower$Replicate==2),"Tu_inter"]<-c(cxr_C.R2_sr1$alpha_inter[1]-cxr_C.R2_sr1$alpha_inter_standard_error[1], cxr_C.R2$alpha_inter[2]-cxr_C.R2_sr1$alpha_inter_standard_error[2])
Error: object 'cxr_C.R2' not found
data table summary cadmium

cxr_param_CC<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("Cd"))
cxr_param_CC$Tu_lambda<-0
cxr_param_CC$Te_lambda<-0
cxr_param_CC$Tu_intra<-0
cxr_param_CC$Te_intra<-0
cxr_param_CC$Tu_inter<-0
cxr_param_CC$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_CC<-cxr_param_CC[-which(cxr_param_CC$Replicate==2 & cxr_param_CC$Tu_Regime=="SR2"),]


cxr_param_CC[which(cxr_param_CC$Replicate==1),"Tu_lambda"]<-c(cxr_C.R1_cd$fixed_terms[[1]]$lambda,cxr_C.R1_cd$fixed_terms[[2]]$lambda)
cxr_param_CC[which(cxr_param_CC$Replicate==1),"Te_lambda"]<-c(cxr_C.R1_cd$fixed_terms[[3]]$lambda,cxr_C.R1_cd$fixed_terms[[3]]$lambda, cxr_C.R1_cd$fixed_terms[[4]]$lambda,cxr_C.R1_cd$fixed_terms[[4]]$lambda)

cxr_param_CC[which(cxr_param_CC$Replicate==2),"Tu_lambda"]<-c(cxr_C.R2_cd_sr1$fixed_terms[[1]],cxr_C.R2_cd_sr1$fixed_terms[[1]])
cxr_param_CC[which(cxr_param_CC$Replicate==2),"Te_lambda"]<-c(cxr_C.R2_cd_sr4$fixed_terms[[1]], cxr_C.R2_cd_sr5$fixed_terms[[1]])

cxr_param_CC[which(cxr_param_CC$Replicate==3),"Tu_lambda"]<-c(cxr_C.R3_cd$fixed_terms[[1]]$lambda,cxr_C.R3_cd$fixed_terms[[2]]$lambda)
cxr_param_CC[which(cxr_param_CC$Replicate==3),"Te_lambda"]<-c(cxr_C.R3_cd$fixed_terms[[3]]$lambda,cxr_C.R3_cd$fixed_terms[[3]]$lambda, cxr_C.R3_cd$fixed_terms[[4]]$lambda,cxr_C.R3_cd$fixed_terms[[4]]$lambda)

cxr_param_CC[which(cxr_param_CC$Replicate==4),"Tu_lambda"]<-c(cxr_C.R4_cd$fixed_terms[[1]]$lambda,cxr_C.R4_cd$fixed_terms[[2]]$lambda)
cxr_param_CC[which(cxr_param_CC$Replicate==4),"Te_lambda"]<-c(cxr_C.R4_cd$fixed_terms[[3]]$lambda,cxr_C.R4_cd$fixed_terms[[3]]$lambda, cxr_C.R4_cd$fixed_terms[[4]]$lambda,cxr_C.R4_cd$fixed_terms[[4]]$lambda)

cxr_param_CC[which(cxr_param_CC$Replicate==5),"Tu_lambda"]<-c(cxr_C.R5_cd$fixed_terms[[1]]$lambda,cxr_C.R5_cd$fixed_terms[[2]]$lambda)
cxr_param_CC[which(cxr_param_CC$Replicate==5),"Te_lambda"]<-c(cxr_C.R5_cd$fixed_terms[[3]]$lambda,cxr_C.R5_cd$fixed_terms[[3]]$lambda, cxr_C.R5_cd$fixed_terms[[4]]$lambda,cxr_C.R5_cd$fixed_terms[[4]]$lambda)


cxr_param_CC[which(cxr_param_CC$Replicate==1),"Tu_intra"]<-rep(c(cxr_C.R1_cd_intra$alpha_matrix[1,1], cxr_C.R1_cd_intra$alpha_matrix[2,1]), 2)
cxr_param_CC[which(cxr_param_CC$Replicate==1),"Te_intra"]<-rep(c(cxr_C.R1_cd_intra$alpha_matrix[3,1], cxr_C.R1_cd_intra$alpha_matrix[4,1]), each=2)

cxr_param_CC[which(cxr_param_CC$Replicate==2),"Tu_intra"]<-rep(c(cxr_C.R2_cd_intra$alpha_matrix[1,1]), 2)
cxr_param_CC[which(cxr_param_CC$Replicate==2),"Te_intra"]<-c(cxr_C.R2_cd_intra$alpha_matrix[2,1], cxr_C.R2_cd_intra$alpha_matrix[3,1])

cxr_param_CC[which(cxr_param_CC$Replicate==3),"Tu_intra"]<-rep(c(cxr_C.R3_cd_intra$alpha_matrix[1,1], cxr_C.R3_cd_intra$alpha_matrix[2,1]), 2)
cxr_param_CC[which(cxr_param_CC$Replicate==3),"Te_intra"]<-rep(c(cxr_C.R3_cd_intra$alpha_matrix[3,1], cxr_C.R3_cd_intra$alpha_matrix[4,1]), each=2)

cxr_param_CC[which(cxr_param_CC$Replicate==4),"Tu_intra"]<-rep(c(cxr_C.R4_cd_intra$alpha_matrix[1,1], cxr_C.R4_cd_intra$alpha_matrix[2,1]), 2)
cxr_param_CC[which(cxr_param_CC$Replicate==4),"Te_intra"]<-rep(c(cxr_C.R4_cd_intra$alpha_matrix[3,1], cxr_C.R4_cd_intra$alpha_matrix[4,1]), each=2)

cxr_param_CC[which(cxr_param_CC$Replicate==5),"Tu_intra"]<-rep(c(cxr_C.R5_cd_intra$alpha_matrix[1,1], cxr_C.R5_cd_intra$alpha_matrix[2,1]), 2)
cxr_param_CC[which(cxr_param_CC$Replicate==5),"Te_intra"]<-rep(c(cxr_C.R5_cd_intra$alpha_matrix[3,1], cxr_C.R5_cd_intra$alpha_matrix[4,1]), each=2)


cxr_param_CC[which(cxr_param_CC$Replicate==1),"Tu_inter"]<-c(cxr_C.R1_cd$alpha_matrix[1,3], cxr_C.R1_cd$alpha_matrix[2,3],cxr_C.R1_cd$alpha_matrix[1,4], cxr_C.R1_cd$alpha_matrix[2,4])
cxr_param_CC[which(cxr_param_CC$Replicate==1),"Te_inter"]<-c(cxr_C.R1_cd$alpha_matrix[3,1], cxr_C.R1_cd$alpha_matrix[3,2],cxr_C.R1_cd$alpha_matrix[4,1], cxr_C.R1_cd$alpha_matrix[4,2])

cxr_param_CC[which(cxr_param_CC$Replicate==2),"Tu_inter"]<-c(cxr_C.R2_cd_sr1$alpha_inter[1], cxr_C.R2_cd_sr1$alpha_inter[2])
cxr_param_CC[which(cxr_param_CC$Replicate==2),"Te_inter"]<-c(cxr_C.R2_cd_sr4$alpha_inter[1], cxr_C.R2_cd_sr5$alpha_inter[1])

cxr_param_CC[which(cxr_param_CC$Replicate==3),"Tu_inter"]<-c(cxr_C.R3_cd$alpha_matrix[1,3], cxr_C.R3_cd$alpha_matrix[2,3],cxr_C.R3_cd$alpha_matrix[1,4], cxr_C.R3_cd$alpha_matrix[2,4])
cxr_param_CC[which(cxr_param_CC$Replicate==3),"Te_inter"]<-c(cxr_C.R3_cd$alpha_matrix[3,1], cxr_C.R3_cd$alpha_matrix[3,2],cxr_C.R3_cd$alpha_matrix[4,1], cxr_C.R3_cd$alpha_matrix[4,2])

cxr_param_CC[which(cxr_param_CC$Replicate==4),"Tu_inter"]<-c(cxr_C.R4_cd$alpha_matrix[1,3], cxr_C.R4_cd$alpha_matrix[2,3],cxr_C.R4_cd$alpha_matrix[1,4], cxr_C.R4_cd$alpha_matrix[2,4])
cxr_param_CC[which(cxr_param_CC$Replicate==4),"Te_inter"]<-c(cxr_C.R4_cd$alpha_matrix[3,1], cxr_C.R4_cd$alpha_matrix[3,2],cxr_C.R4_cd$alpha_matrix[4,1], cxr_C.R4_cd$alpha_matrix[4,2])

cxr_param_CC[which(cxr_param_CC$Replicate==5),"Tu_inter"]<-c(cxr_C.R5_cd$alpha_matrix[1,3], cxr_C.R5_cd$alpha_matrix[2,3],cxr_C.R5_cd$alpha_matrix[1,4], cxr_C.R5_cd$alpha_matrix[2,4])
cxr_param_CC[which(cxr_param_CC$Replicate==5),"Te_inter"]<-c(cxr_C.R5_cd$alpha_matrix[3,1], cxr_C.R5_cd$alpha_matrix[3,2],cxr_C.R5_cd$alpha_matrix[4,1], cxr_C.R5_cd$alpha_matrix[4,2])

### Lower

cxr_param_CC_lower<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("Cd"))
cxr_param_CC_lower$Tu_lambda<-0
cxr_param_CC_lower$Te_lambda<-0
cxr_param_CC_lower$Tu_intra<-0
cxr_param_CC_lower$Te_intra<-0
cxr_param_CC_lower$Tu_inter<-0
cxr_param_CC_lower$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_CC_lower<-cxr_param_CC_lower[-which(cxr_param_CC_lower$Replicate==2 & cxr_param_CC_lower$Tu_Regime=="SR2"),]

#Since the error comes directly from the data we need to create some lists with that information
sd_1C <- list(list(lambda = subset(mean_dens1, Rep==1 & Env=="Cd" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="Cd" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==1 & Env=="Cd" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==1 & Env=="Cd" & SR==5)$sd_lambda))

sd_2C <- list(list(lambda = subset(mean_dens1, Rep==2 & Env=="Cd" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==2 & Env=="Cd" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==2 & Env=="Cd" & SR==5)$sd_lambda))

sd_3C <- list(list(lambda = subset(mean_dens1, Rep==3 & Env=="Cd" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="Cd" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==3 & Env=="Cd" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==3 & Env=="Cd" & SR==5)$sd_lambda))

sd_4C <- list(list(lambda = subset(mean_dens1, Rep==4 & Env=="Cd" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="Cd" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==4 & Env=="Cd" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==4 & Env=="Cd" & SR==5)$sd_lambda))

sd_5C <- list(list(lambda = subset(mean_dens1, Rep==5 & Env=="Cd" & SR==1)$sd_lambda ), # focal sp 1
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="Cd" & SR==2)$sd_lambda), # focal sp 2
                    list(lambda = subset(mean_dens1, Rep==5 & Env=="Cd" & SR==4)$sd_lambda),
                    list(lambda= subset(mean_dens1, Rep==5 & Env=="Cd" & SR==5)$sd_lambda))

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==1),"Tu_lambda"]<-c(cxr_C.R1_cd$fixed_terms[[1]]$lambda-sd_1C[[1]]$lambda,cxr_C.R1_cd$fixed_terms[[2]]$lambda-sd_1C[[2]]$lambda)
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==1),"Te_lambda"]<-c(cxr_C.R1_cd$fixed_terms[[3]]$lambda-sd_1C[[3]]$lambda,cxr_C.R1_cd$fixed_terms[[3]]$lambda-sd_1C[[3]]$lambda, cxr_C.R1_cd$fixed_terms[[4]]$lambda-sd_1C[[4]]$lambda,cxr_C.R1_cd$fixed_terms[[4]]$lambda-sd_1C[[4]]$lambda)

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==2),"Tu_lambda"]<-c(cxr_C.R2_cd_sr1$fixed_terms$lambda-sd_2C[[1]]$lambda,cxr_C.R2_cd_sr1$fixed_terms$lambda-sd_2C[[1]]$lambda)
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==2),"Te_lambda"]<-c(cxr_C.R2_cd_sr4$fixed_terms$lambda-sd_2C[[2]]$lambda,cxr_C.R2_cd_sr5$fixed_terms$lambda-sd_2C[[3]]$lambda)

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==3),"Tu_lambda"]<-c(cxr_C.R3_cd$fixed_terms[[1]]$lambda-sd_3C[[1]]$lambda,cxr_C.R3_cd$fixed_terms[[2]]$lambda-sd_3C[[2]]$lambda)
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==3),"Te_lambda"]<-c(cxr_C.R3_cd$fixed_terms[[3]]$lambda-sd_3C[[3]]$lambda,cxr_C.R3_cd$fixed_terms[[3]]$lambda-sd_3C[[3]]$lambda, cxr_C.R3_cd$fixed_terms[[4]]$lambda-sd_3C[[4]]$lambda,cxr_C.R3_cd$fixed_terms[[4]]$lambda-sd_3C[[4]]$lambda)

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==4),"Tu_lambda"]<-c(cxr_C.R4_cd$fixed_terms[[1]]$lambda-sd_4C[[1]]$lambda,cxr_C.R4_cd$fixed_terms[[2]]$lambda-sd_4C[[2]]$lambda)
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==4),"Te_lambda"]<-c(cxr_C.R4_cd$fixed_terms[[3]]$lambda-sd_4C[[3]]$lambda,cxr_C.R4_cd$fixed_terms[[3]]$lambda-sd_4C[[3]]$lambda, cxr_C.R4_cd$fixed_terms[[4]]$lambda-sd_4C[[4]]$lambda,cxr_C.R4_cd$fixed_terms[[4]]$lambda-sd_4C[[4]]$lambda)

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==5),"Tu_lambda"]<-c(cxr_C.R5_cd$fixed_terms[[1]]$lambda-sd_5C[[1]]$lambda,cxr_C.R5_cd$fixed_terms[[2]]$lambda-sd_5C[[2]]$lambda)
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==5),"Te_lambda"]<-c(cxr_C.R5_cd$fixed_terms[[3]]$lambda-sd_5C[[3]]$lambda,cxr_C.R5_cd$fixed_terms[[3]]$lambda-sd_5C[[3]]$lambda, cxr_C.R5_cd$fixed_terms[[4]]$lambda-sd_5C[[4]]$lambda,cxr_C.R5_cd$fixed_terms[[4]]$lambda-sd_5C[[4]]$lambda)


cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==1),"Tu_intra"]<-rep(c(cxr_C.R1_cd_intra$alpha_matrix[1,1]-cxr_C.R1_cd_intra$alpha_matrix_standard_error[1,1], cxr_C.R1_cd_intra$alpha_matrix[2,1]-cxr_C.R1_cd_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==1),"Te_intra"]<-rep(c(cxr_C.R1_cd_intra$alpha_matrix[3,1]-cxr_C.R1_cd_intra$alpha_matrix_standard_error[3,1], cxr_C.R1_cd_intra$alpha_matrix[4,1]-cxr_C.R1_cd_intra$alpha_matrix_standard_error[4,1]), each=2)

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==2),"Tu_intra"]<-cxr_C.R2_cd_intra$alpha_matrix[1,1]-cxr_C.R2_cd_intra$alpha_matrix_standard_error[1,1]
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==2),"Te_intra"]<-c(cxr_C.R2_cd_intra$alpha_matrix[2,1]-cxr_C.R2_cd_intra$alpha_matrix_standard_error[2,1], cxr_C.R2_cd_intra$alpha_matrix[3,1]-cxr_C.R2_cd_intra$alpha_matrix_standard_error[3,1])

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==3),"Tu_intra"]<-rep(c(cxr_C.R3_cd_intra$alpha_matrix[1,1]-cxr_C.R3_cd_intra$alpha_matrix_standard_error[1,1], cxr_C.R3_cd_intra$alpha_matrix[2,1]-cxr_C.R3_cd_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==3),"Te_intra"]<-rep(c(cxr_C.R3_cd_intra$alpha_matrix[3,1]-cxr_C.R3_cd_intra$alpha_matrix_standard_error[3,1], cxr_C.R3_cd_intra$alpha_matrix[4,1]-cxr_C.R3_cd_intra$alpha_matrix_standard_error[4,1]), each=2)

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==4),"Tu_intra"]<-rep(c(cxr_C.R4_cd_intra$alpha_matrix[1,1]-cxr_C.R4_cd_intra$alpha_matrix_standard_error[1,1], cxr_C.R4_cd_intra$alpha_matrix[2,1]-cxr_C.R4_cd_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==4),"Te_intra"]<-rep(c(cxr_C.R4_cd_intra$alpha_matrix[3,1]-cxr_C.R4_cd_intra$alpha_matrix_standard_error[3,1], cxr_C.R4_cd_intra$alpha_matrix[4,1]-cxr_C.R4_cd_intra$alpha_matrix_standard_error[4,1]), each=2)

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==5),"Tu_intra"]<-rep(c(cxr_C.R5_cd_intra$alpha_matrix[1,1]-cxr_C.R5_cd_intra$alpha_matrix_standard_error[1,1], cxr_C.R5_cd_intra$alpha_matrix[2,1]-cxr_C.R5_cd_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==5),"Te_intra"]<-rep(c(cxr_C.R5_cd_intra$alpha_matrix[3,1]-cxr_C.R5_cd_intra$alpha_matrix_standard_error[3,1], cxr_C.R5_cd_intra$alpha_matrix[4,1]-cxr_C.R5_cd_intra$alpha_matrix_standard_error[4,1]), each=2)


cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==1),"Tu_inter"]<-c(cxr_C.R1_cd$alpha_matrix[1,3]-cxr_C.R1_cd$alpha_matrix_standard_error[1,3], cxr_C.R1_cd$alpha_matrix[2,3]-cxr_C.R1_cd$alpha_matrix_standard_error[2,3],cxr_C.R1_cd$alpha_matrix[1,4]-cxr_C.R1_cd$alpha_matrix_standard_error[1,4], cxr_C.R1_cd$alpha_matrix[2,4]-cxr_C.R1_cd$alpha_matrix_standard_error[2,4])
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==1),"Te_inter"]<-c(cxr_C.R1_cd$alpha_matrix[3,1]-cxr_C.R1_cd$alpha_matrix_standard_error[3,1], cxr_C.R1_cd$alpha_matrix[3,2]-cxr_C.R1_cd$alpha_matrix_standard_error[3,2],cxr_C.R1_cd$alpha_matrix[4,1]-cxr_C.R1_cd$alpha_matrix_standard_error[4,1], cxr_C.R1_cd$alpha_matrix[4,2]-cxr_C.R1_cd$alpha_matrix_standard_error[4,2])

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==2),"Tu_inter"]<-c(cxr_C.R2_cd_sr1$alpha_inter[1]-cxr_C.R2_cd_sr1$alpha_inter_standard_error[1], cxr_C.R2_cd_sr1$alpha_inter[2]-cxr_C.R2_cd_sr1$alpha_inter_standard_error[2])
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==2),"Te_inter"]<-c(cxr_C.R2_cd_sr4$alpha_inter[1]-cxr_C.R2_cd_sr4$alpha_inter_standard_error[1], cxr_C.R2_cd_sr5$alpha_inter[1]-cxr_C.R2_cd_sr5$alpha_inter_standard_error[1])

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==3),"Tu_inter"]<-c(cxr_C.R3_cd$alpha_matrix[1,3]-cxr_C.R3_cd$alpha_matrix_standard_error[1,3], cxr_C.R3_cd$alpha_matrix[2,3]-cxr_C.R3_cd$alpha_matrix_standard_error[2,3],cxr_C.R3_cd$alpha_matrix[1,4]-cxr_C.R3_cd$alpha_matrix_standard_error[1,4], cxr_C.R3_cd$alpha_matrix[2,4]-cxr_C.R3_cd$alpha_matrix_standard_error[2,4])
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==3),"Te_inter"]<-c(cxr_C.R3_cd$alpha_matrix[3,1]-cxr_C.R3_cd$alpha_matrix_standard_error[3,1], cxr_C.R3_cd$alpha_matrix[3,2]-cxr_C.R3_cd$alpha_matrix_standard_error[3,2],cxr_C.R3_cd$alpha_matrix[4,1]-cxr_C.R3_cd$alpha_matrix_standard_error[4,1], cxr_C.R3_cd$alpha_matrix[4,2]-cxr_C.R3_cd$alpha_matrix_standard_error[4,2])

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==4),"Tu_inter"]<-c(cxr_C.R4_cd$alpha_matrix[1,3]-cxr_C.R4_cd$alpha_matrix_standard_error[1,3], cxr_C.R4_cd$alpha_matrix[2,3]-cxr_C.R4_cd$alpha_matrix_standard_error[2,3],cxr_C.R4_cd$alpha_matrix[1,4]-cxr_C.R4_cd$alpha_matrix_standard_error[1,4], cxr_C.R4_cd$alpha_matrix[2,4]-cxr_C.R4_cd$alpha_matrix_standard_error[2,4])
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==4),"Te_inter"]<-c(cxr_C.R4_cd$alpha_matrix[3,1]-cxr_C.R4_cd$alpha_matrix_standard_error[3,1], cxr_C.R4_cd$alpha_matrix[3,2]-cxr_C.R4_cd$alpha_matrix_standard_error[3,2],cxr_C.R4_cd$alpha_matrix[4,1]-cxr_C.R4_cd$alpha_matrix_standard_error[4,1], cxr_C.R4_cd$alpha_matrix[4,2]-cxr_C.R4_cd$alpha_matrix_standard_error[4,2])

cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==5),"Tu_inter"]<-c(cxr_C.R5_cd$alpha_matrix[1,3]-cxr_C.R5_cd$alpha_matrix_standard_error[1,3], cxr_C.R5_cd$alpha_matrix[2,3]-cxr_C.R5_cd$alpha_matrix_standard_error[2,3],cxr_C.R5_cd$alpha_matrix[1,4]-cxr_C.R5_cd$alpha_matrix_standard_error[1,4], cxr_C.R5_cd$alpha_matrix[2,4]-cxr_C.R5_cd$alpha_matrix_standard_error[2,4])
cxr_param_CC_lower[which(cxr_param_CC_lower$Replicate==5),"Te_inter"]<-c(cxr_C.R5_cd$alpha_matrix[3,1]-cxr_C.R5_cd$alpha_matrix_standard_error[3,1], cxr_C.R5_cd$alpha_matrix[3,2]-cxr_C.R5_cd$alpha_matrix_standard_error[3,2],cxr_C.R5_cd$alpha_matrix[4,1]-cxr_C.R5_cd$alpha_matrix_standard_error[4,1], cxr_C.R5_cd$alpha_matrix[4,2]-cxr_C.R5_cd$alpha_matrix_standard_error[4,2])

### upper

cxr_param_CC_upper<-expand.grid(Tu_Regime=c("SR1", "SR2"), Te_Regime=c("SR4", "SR5"), Replicate=c(1,2,3,4,5), Environment=c("Cd"))
cxr_param_CC_upper$Tu_lambda<-0
cxr_param_CC_upper$Te_lambda<-0
cxr_param_CC_upper$Tu_intra<-0
cxr_param_CC_upper$Te_intra<-0
cxr_param_CC_upper$Tu_inter<-0
cxr_param_CC_upper$Te_inter<-0

#removing SR2 for replicate 2
cxr_param_CC_upper<-cxr_param_CC_upper[-which(cxr_param_CC_upper$Replicate==2 & cxr_param_CC_upper$Tu_Regime=="SR2"),]


cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==1),"Tu_lambda"]<-c(cxr_C.R1_cd$fixed_terms[[1]]$lambda+sd_1C[[1]]$lambda,cxr_C.R1_cd$fixed_terms[[2]]$lambda+sd_1C[[2]]$lambda)
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==1),"Te_lambda"]<-c(cxr_C.R1_cd$fixed_terms[[3]]$lambda+sd_1C[[3]]$lambda,cxr_C.R1_cd$fixed_terms[[3]]$lambda+sd_1C[[3]]$lambda, cxr_C.R1_cd$fixed_terms[[4]]$lambda+sd_1C[[4]]$lambda,cxr_C.R1_cd$fixed_terms[[4]]$lambda+sd_1C[[4]]$lambda)

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==2),"Tu_lambda"]<-c(cxr_C.R2_cd_sr1$fixed_terms$lambda+sd_2C[[1]]$lambda,cxr_C.R2_cd_sr1$fixed_terms$lambda+sd_2C[[1]]$lambda)
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==2),"Te_lambda"]<-c(cxr_C.R2_cd_sr4$fixed_terms$lambda+sd_2C[[2]]$lambda,cxr_C.R2_cd_sr5$fixed_terms$lambda+sd_2C[[3]]$lambda)

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==3),"Tu_lambda"]<-c(cxr_C.R3_cd$fixed_terms[[1]]$lambda+sd_3C[[1]]$lambda,cxr_C.R3_cd$fixed_terms[[2]]$lambda+sd_3C[[2]]$lambda)
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==3),"Te_lambda"]<-c(cxr_C.R3_cd$fixed_terms[[3]]$lambda+sd_3C[[3]]$lambda,cxr_C.R3_cd$fixed_terms[[3]]$lambda+sd_3C[[3]]$lambda, cxr_C.R3_cd$fixed_terms[[4]]$lambda+sd_3C[[4]]$lambda,cxr_C.R3_cd$fixed_terms[[4]]$lambda+sd_3C[[4]]$lambda)

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==4),"Tu_lambda"]<-c(cxr_C.R4_cd$fixed_terms[[1]]$lambda+sd_4C[[1]]$lambda,cxr_C.R4_cd$fixed_terms[[2]]$lambda+sd_4C[[2]]$lambda)
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==4),"Te_lambda"]<-c(cxr_C.R4_cd$fixed_terms[[3]]$lambda+sd_4C[[3]]$lambda,cxr_C.R4_cd$fixed_terms[[3]]$lambda+sd_4C[[3]]$lambda, cxr_C.R4_cd$fixed_terms[[4]]$lambda+sd_4C[[4]]$lambda,cxr_C.R4_cd$fixed_terms[[4]]$lambda+sd_4C[[4]]$lambda)

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==5),"Tu_lambda"]<-c(cxr_C.R5_cd$fixed_terms[[1]]$lambda+sd_5C[[1]]$lambda,cxr_C.R5_cd$fixed_terms[[2]]$lambda+sd_5C[[2]]$lambda)
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==5),"Te_lambda"]<-c(cxr_C.R5_cd$fixed_terms[[3]]$lambda+sd_5C[[3]]$lambda,cxr_C.R5_cd$fixed_terms[[3]]$lambda+sd_5C[[3]]$lambda, cxr_C.R5_cd$fixed_terms[[4]]$lambda+sd_5C[[4]]$lambda,cxr_C.R5_cd$fixed_terms[[4]]$lambda+sd_5C[[4]]$lambda)


cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==1),"Tu_intra"]<-rep(c(cxr_C.R1_cd_intra$alpha_matrix[1,1]+cxr_C.R1_cd_intra$alpha_matrix_standard_error[1,1], cxr_C.R1_cd_intra$alpha_matrix[2,1]+cxr_C.R1_cd_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==1),"Te_intra"]<-rep(c(cxr_C.R1_cd_intra$alpha_matrix[3,1]+cxr_C.R1_cd_intra$alpha_matrix_standard_error[3,1], cxr_C.R1_cd_intra$alpha_matrix[4,1]+cxr_C.R1_cd_intra$alpha_matrix_standard_error[4,1]), each=2)

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==2),"Tu_intra"]<-c(cxr_C.R2_cd_intra$alpha_matrix[1,1]+cxr_C.R2_cd_intra$alpha_matrix_standard_error[1,1],cxr_C.R2_cd_intra$alpha_matrix[1,1]+cxr_C.R2_cd_intra$alpha_matrix_standard_error[1,1])
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==2),"Te_intra"]<-c(cxr_C.R2_cd_intra$alpha_matrix[2,1]+cxr_C.R2_cd_intra$alpha_matrix_standard_error[2,1],cxr_C.R2_cd_intra$alpha_matrix[3,1]+cxr_C.R2_cd_intra$alpha_matrix_standard_error[3,1])

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==3),"Tu_intra"]<-rep(c(cxr_C.R3_cd_intra$alpha_matrix[1,1]+cxr_C.R3_cd_intra$alpha_matrix_standard_error[1,1], cxr_C.R3_cd_intra$alpha_matrix[2,1]+cxr_C.R3_cd_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==3),"Te_intra"]<-rep(c(cxr_C.R3_cd_intra$alpha_matrix[3,1]+cxr_C.R3_cd_intra$alpha_matrix_standard_error[3,1], cxr_C.R3_cd_intra$alpha_matrix[4,1]+cxr_C.R3_cd_intra$alpha_matrix_standard_error[4,1]), each=2)

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==4),"Tu_intra"]<-rep(c(cxr_C.R4_cd_intra$alpha_matrix[1,1]+cxr_C.R4_cd_intra$alpha_matrix_standard_error[1,1], cxr_C.R4_cd_intra$alpha_matrix[2,1]+cxr_C.R4_cd_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==4),"Te_intra"]<-rep(c(cxr_C.R4_cd_intra$alpha_matrix[3,1]+cxr_C.R4_cd_intra$alpha_matrix_standard_error[3,1], cxr_C.R4_cd_intra$alpha_matrix[4,1]+cxr_C.R4_cd_intra$alpha_matrix_standard_error[4,1]), each=2)

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==5),"Tu_intra"]<-rep(c(cxr_C.R5_cd_intra$alpha_matrix[1,1]+cxr_C.R5_cd_intra$alpha_matrix_standard_error[1,1], cxr_C.R5_cd_intra$alpha_matrix[2,1]+cxr_C.R5_cd_intra$alpha_matrix_standard_error[2,1]), 2)
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==5),"Te_intra"]<-rep(c(cxr_C.R5_cd_intra$alpha_matrix[3,1]+cxr_C.R5_cd_intra$alpha_matrix_standard_error[3,1], cxr_C.R5_cd_intra$alpha_matrix[4,1]+cxr_C.R5_cd_intra$alpha_matrix_standard_error[4,1]), each=2)


cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==1),"Tu_inter"]<-c(cxr_C.R1_cd$alpha_matrix[1,3]+cxr_C.R1_cd$alpha_matrix_standard_error[1,3], cxr_C.R1_cd$alpha_matrix[2,3]+cxr_C.R1_cd$alpha_matrix_standard_error[2,3],cxr_C.R1_cd$alpha_matrix[1,4]+cxr_C.R1_cd$alpha_matrix_standard_error[1,4], cxr_C.R1_cd$alpha_matrix[2,4]+cxr_C.R1_cd$alpha_matrix_standard_error[2,4])
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==1),"Te_inter"]<-c(cxr_C.R1_cd$alpha_matrix[3,1]+cxr_C.R1_cd$alpha_matrix_standard_error[3,1], cxr_C.R1_cd$alpha_matrix[3,2]+cxr_C.R1_cd$alpha_matrix_standard_error[3,2],cxr_C.R1_cd$alpha_matrix[4,1]+cxr_C.R1_cd$alpha_matrix_standard_error[4,1], cxr_C.R1_cd$alpha_matrix[4,2]+cxr_C.R1_cd$alpha_matrix_standard_error[4,2])

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==2),"Tu_inter"]<-c(cxr_C.R2_cd_sr1$alpha_inter[1]+cxr_C.R2_cd_sr1$alpha_inter_standard_error[1], cxr_C.R2_cd_sr1$alpha_inter[2]+cxr_C.R2_cd_sr1$alpha_inter_standard_error[2])
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==2),"Te_inter"]<-c(cxr_C.R2_cd_sr4$alpha_inter[1]+cxr_C.R2_cd_sr4$alpha_inter_standard_error[1], cxr_C.R2_cd_sr5$alpha_inter[1]+cxr_C.R2_cd_sr5$alpha_inter_standard_error[1])

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==3),"Tu_inter"]<-c(cxr_C.R3_cd$alpha_matrix[1,3]+cxr_C.R3_cd$alpha_matrix_standard_error[1,3], cxr_C.R3_cd$alpha_matrix[2,3]+cxr_C.R3_cd$alpha_matrix_standard_error[2,3],cxr_C.R3_cd$alpha_matrix[1,4]+cxr_C.R3_cd$alpha_matrix_standard_error[1,4], cxr_C.R3_cd$alpha_matrix[2,4]+cxr_C.R3_cd$alpha_matrix_standard_error[2,4])
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==3),"Te_inter"]<-c(cxr_C.R3_cd$alpha_matrix[3,1]+cxr_C.R3_cd$alpha_matrix_standard_error[3,1], cxr_C.R3_cd$alpha_matrix[3,2]+cxr_C.R3_cd$alpha_matrix_standard_error[3,2],cxr_C.R3_cd$alpha_matrix[4,1]+cxr_C.R3_cd$alpha_matrix_standard_error[4,1], cxr_C.R3_cd$alpha_matrix[4,2]+cxr_C.R3_cd$alpha_matrix_standard_error[4,2])

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==4),"Tu_inter"]<-c(cxr_C.R4_cd$alpha_matrix[1,3]+cxr_C.R4_cd$alpha_matrix_standard_error[1,3], cxr_C.R4_cd$alpha_matrix[2,3]+cxr_C.R4_cd$alpha_matrix_standard_error[2,3],cxr_C.R4_cd$alpha_matrix[1,4]+cxr_C.R4_cd$alpha_matrix_standard_error[1,4], cxr_C.R4_cd$alpha_matrix[2,4]+cxr_C.R4_cd$alpha_matrix_standard_error[2,4])
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==4),"Te_inter"]<-c(cxr_C.R4_cd$alpha_matrix[3,1]+cxr_C.R4_cd$alpha_matrix_standard_error[3,1], cxr_C.R4_cd$alpha_matrix[3,2]+cxr_C.R4_cd$alpha_matrix_standard_error[3,2],cxr_C.R4_cd$alpha_matrix[4,1]+cxr_C.R4_cd$alpha_matrix_standard_error[4,1], cxr_C.R4_cd$alpha_matrix[4,2]+cxr_C.R4_cd$alpha_matrix_standard_error[4,2])

cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==5),"Tu_inter"]<-c(cxr_C.R5_cd$alpha_matrix[1,3]+cxr_C.R5_cd$alpha_matrix_standard_error[1,3], cxr_C.R5_cd$alpha_matrix[2,3]+cxr_C.R5_cd$alpha_matrix_standard_error[2,3],cxr_C.R5_cd$alpha_matrix[1,4]+cxr_C.R5_cd$alpha_matrix_standard_error[1,4], cxr_C.R5_cd$alpha_matrix[2,4]+cxr_C.R5_cd$alpha_matrix_standard_error[2,4])
cxr_param_CC_upper[which(cxr_param_CC_upper$Replicate==5),"Te_inter"]<-c(cxr_C.R5_cd$alpha_matrix[3,1]+cxr_C.R5_cd$alpha_matrix_standard_error[3,1], cxr_C.R5_cd$alpha_matrix[3,2]+cxr_C.R5_cd$alpha_matrix_standard_error[3,2],cxr_C.R5_cd$alpha_matrix[4,1]+cxr_C.R5_cd$alpha_matrix_standard_error[4,1], cxr_C.R5_cd$alpha_matrix[4,2]+cxr_C.R5_cd$alpha_matrix_standard_error[4,2])
joining data frame

param_all_C<-as.data.frame(rbind(cxr_param_C, cxr_param_CC))

param_all_C_lower<-as.data.frame(rbind(cxr_param_C_lower, cxr_param_CC_lower))
param_all_C_upper<-as.data.frame(rbind(cxr_param_C_upper, cxr_param_CC_upper))


param_all_C_lower
param_all_C_upper

write.csv(param_all_C, "./NewAnalyses/cxr_lambda_fixed_nested/parameters_cxr_lambda_fixed.csv")
write.csv(param_all_C_upper, "./NewAnalyses/cxr_lambda_fixed_nested/parameters_cxr_lambda_fixed_upper.csv")
write.csv(param_all_C_lower, "./NewAnalyses/cxr_lambda_fixed_nested/parameters_cxr_lambda_fixed_lower.csv")
importing data frame

param_all_C<-read.csv("./NewAnalyses/cxr_lambda_fixed_nested/parameters_cxr_lambda_fixed.csv")
param_all_C_upper<-read.csv("./NewAnalyses/cxr_lambda_fixed_nested/parameters_cxr_lambda_fixed_upper.csv")
param_all_C_lower<-read.csv("./NewAnalyses/cxr_lambda_fixed_nested/parameters_cxr_lambda_fixed_lower.csv")

param_all_C<-param_all_C[,-1]
param_all_C_upper<-param_all_C_upper[,-1]
param_all_C_lower<-param_all_C_lower[,-1]

param_all_C_long<-gather(param_all_C, parameter, value,Tu_lambda:Te_inter )

param_all_C_long$category<-mapvalues(param_all_C_long$parameter, c("Tu_lambda", "Te_lambda", "Tu_intra", "Te_intra","Tu_inter", "Te_inter"), c("lambda", "lambda", "intra", "intra", "inter", "inter"))

param_all_C_lower_long<-gather(param_all_C_lower, parameter, value,Tu_lambda:Te_inter )

param_all_C_lower_long$category<-mapvalues(param_all_C_lower_long$parameter, c("Tu_lambda", "Te_lambda", "Tu_intra", "Te_intra","Tu_inter", "Te_inter"), c("lambda", "lambda", "intra", "intra", "inter", "inter"))

param_all_C_upper_long<-gather(param_all_C_upper, parameter, value,Tu_lambda:Te_inter )

param_all_C_upper_long$category<-mapvalues(param_all_C_upper_long$parameter, c("Tu_lambda", "Te_lambda", "Tu_intra", "Te_intra","Tu_inter", "Te_inter"), c("lambda", "lambda", "intra", "intra", "inter", "inter"))

colnames(param_all_C_lower_long)[6]<-"lower"
colnames(param_all_C_upper_long)[6]<-"upper"

str(param_all_C_long)
'data.frame':   216 obs. of  7 variables:
 $ Tu_Regime  : chr  "SR1" "SR2" "SR1" "SR2" ...
 $ Te_Regime  : chr  "SR4" "SR4" "SR5" "SR5" ...
 $ Replicate  : int  1 1 1 1 2 2 3 3 3 3 ...
 $ Environment: chr  "N" "N" "N" "N" ...
 $ parameter  : chr  "Tu_lambda" "Tu_lambda" "Tu_lambda" "Tu_lambda" ...
 $ value      : num  3.9 3.7 3.9 3.7 4.2 ...
 $ category   : chr  "lambda" "lambda" "lambda" "lambda" ...
param_all_C_long<-cbind(param_all_C_long[,1:7],param_all_C_lower_long$lower, param_all_C_upper_long$upper)

colnames(param_all_C_long)[8:9]<-c("lower","upper")


# Comparison control vs evolved per environment
ggplot(subset(param_all_C_long, parameter=="Te_intra" & Tu_Regime=="SR1"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/param_RK_intraTe_w0_rep_env.pdf", width=20, height=15)


ggplot(subset(param_all_C_long, parameter=="Tu_intra" & Te_Regime=="SR4"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/param_RK_intraTu_w0_rep_env.pdf", width=20, height=15)



ggplot(subset(param_all_C_long, parameter=="Te_inter"), aes(x=Environment, y=value, fill=Te_Regime))+
  facet_grid(Tu_Regime~., labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/param_RK_interTe_w0_rep_env.pdf", width=20, height=15)


ggplot(subset(param_all_C_long, parameter=="Tu_inter"), aes(fill=Tu_Regime, y=value, x=Environment))+
  facet_grid(Te_Regime~., labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/param_RK_interTu_w0_rep_env.pdf", width=20, height=15)



ggplot(subset(param_all_C_long, parameter=="Te_lambda" & Tu_Regime=="SR1"), aes(x=Environment, y=value, fill=Te_Regime))+
  geom_boxplot( position=position_dodge2(0.5), outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/param_RK_lambdaTe_w0_rep_env.pdf", width=20, height=15)


ggplot(subset(param_all_C_long, parameter=="Tu_lambda" & Te_Regime=="SR4"), aes(fill=Tu_Regime, y=value, x=Environment))+
  geom_boxplot(position=position_dodge2(0.5), outlier.alpha =0.01)+
  geom_point( position=position_dodge2(0.5))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/param_RK_lambdaTu_w0_rep_env.pdf", width=20, height=15)


#####################################################

Predicting densities


density_aux<-seq(0, 10, by=(10/100))

pred_df_cxr_C<-as.data.frame(expand_grid(Density=density_aux, Tu_Regime=c("SR1","SR2"), Te_Regime=c("SR4","SR5"), Replicate=c(1:5), Environment=c("N", "Cd")))

pred_df_cxr_C$Tu_mean_intra<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Tu_mean_inter<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_C$Density[x])
    
    pred
})


pred_df_cxr_C$Tu_intra_L<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Tu_inter_L<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Tu_intra_U<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Tu_inter_U<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_inter[1]
    lambda<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Te_mean_intra<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Te_mean_inter<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_C, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Te_intra_L<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Te_inter_L<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_C_lower, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Te_intra_U<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_cxr_C$Density[x])
    
    pred
})

pred_df_cxr_C$Te_inter_U<-sapply(c(1:length(pred_df_cxr_C[,1])), function(x){
   alpha_i<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Tu_Regime==pred_df_cxr_C$Tu_Regime[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_inter[1]
    lambda<-subset(param_all_C_upper, Environment==pred_df_cxr_C$Environment[x] & Te_Regime==pred_df_cxr_C$Te_Regime[x] & Replicate==pred_df_cxr_C$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_cxr_C$Density[x])
    
    pred
})

# Removing Tu evolved replicate 2 because there is no data
pred_df_cxr_C<-pred_df_cxr_C[-which(pred_df_cxr_C$Tu_Regime=="SR2" & pred_df_cxr_C$Replicate==2),]



# Transforming everything bellow 0 into 0 for the lower interval

pred_df_cxr_C$Te_inter_L[which(pred_df_cxr_C$Te_inter_L<0)]<-0
pred_df_cxr_C$Te_intra_L[which(pred_df_cxr_C$Te_intra_L<0)]<-0
pred_df_cxr_C$Tu_inter_L[which(pred_df_cxr_C$Tu_inter_L<0)]<-0
pred_df_cxr_C$Tu_intra_L[which(pred_df_cxr_C$Tu_intra_L<0)]<-0

which(pred_df_cxr_C$Te_inter_L>pred_df_cxr_C$Te_inter_U)
integer(0)
which(pred_df_cxr_C$Te_intra_L>pred_df_cxr_C$Te_intra_U)
integer(0)
pred_df_cxr_C[which(pred_df_cxr_C$Tu_inter_L>pred_df_cxr_C$Tu_inter_U),]
which(pred_df_cxr_C$Tu_intra_L>pred_df_cxr_C$Tu_intra_U)
integer(0)
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific control environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="Cd" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="Cd" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific cadmium environment")

Plotting predictions

CONTROL INTRA
ca$Replicate<-as.character(ca$Rep)

subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="N" )

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific control environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/pred_Tu_INTRA_Control_water.pdf", width=25, height=10)


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="Cd" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="Cd" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific cadmium environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/pred_Tu_INTRA_Control_cadmium.pdf", width=25, height=10)


#subset(pred_df_cxr_C, Tu_Regime==1 & Environment=="C" & Replicate==3)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="N" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="N" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific control environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/pred_Te_INTRA_Control_control.pdf", width=25, height=10)

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="Cd" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="Cd" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific cadmium environment")
save_plot("./NewAnalyses/cxr_lambda_fixed_nested/pred_Te_INTRA_Control_cadmium.pdf", width=25, height=10)

CONTROL INTER vs control
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="N" & Te_Regime=="SR4"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="N" & Te_Regime=="SR4"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu & Te control interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="Cd" & Te_Regime=="SR4"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="Cd" & Te_Regime=="SR4"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu & Te control interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="N" & Tu_Regime=="SR1"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="N" & Tu_Regime=="SR1"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te  & Tu control intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="Cd" & Tu_Regime=="SR1"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="Cd" & Tu_Regime=="SR1"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te & Tu control interspecific cadmium environment")

CONTROL INTER vs evolved
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="N" & Te_Regime=="SR5"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="N" & Te_Regime=="SR5"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu control & Te evolved interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="Cd" & Te_Regime=="SR5"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR1" & Environment=="Cd" & Te_Regime=="SR5"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu control & Te evolved interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="N" & Tu_Regime=="SR2"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="N" & Tu_Regime=="SR2"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te control  & Tu evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="Cd" & Tu_Regime=="SR2"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR4" & Environment=="Cd" & Tu_Regime=="SR2"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te control  & Tu evolved interspecific cadmium environment")

CONTROL INTRA evolved
ca$Replicate<-as.character(ca$Rep)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved intraspecific control environment")


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="Cd" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="Cd" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved intraspecific cadmium environment")


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="N" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="N" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="Cd" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="Cd" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved intraspecific cadmium environment")

Evolved INTER vs control
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="N" & Te_Regime=="SR4"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="N" & Te_Regime=="SR4"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te control interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="Cd" & Te_Regime=="SR4"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="Cd" & Te_Regime=="SR4"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te control interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="N" & Tu_Regime=="SR1"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="N" & Tu_Regime=="SR1"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu control intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="Cd" & Tu_Regime=="SR1"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="Cd" & Tu_Regime=="SR1"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved & Tu control interspecific cadmium environment")

evolved INTER vs evolved
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="N" & Te_Regime=="SR5"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="N" & Te_Regime=="SR5"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te evolved interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="Cd" & Te_Regime=="SR5"), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Tu_Regime=="SR2" & Environment=="Cd" & Te_Regime=="SR5"), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te evolved interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="N" & Tu_Regime=="SR2"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="N" & Tu_Regime=="SR2"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="Cd" & Tu_Regime=="SR2"), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_cxr_C, Te_Regime=="SR5" & Environment=="Cd" & Tu_Regime=="SR2"), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu evolved interspecific cadmium environment")

Predicted vs observed

str(param_all_C)
'data.frame':   36 obs. of  10 variables:
 $ Tu_Regime  : chr  "SR1" "SR2" "SR1" "SR2" ...
 $ Te_Regime  : chr  "SR4" "SR4" "SR5" "SR5" ...
 $ Replicate  : int  1 1 1 1 2 2 3 3 3 3 ...
 $ Environment: chr  "N" "N" "N" "N" ...
 $ Tu_lambda  : num  3.9 3.7 3.9 3.7 4.2 ...
 $ Te_lambda  : num  11.11 11.11 10 10 9.86 ...
 $ Tu_intra   : num  0.1091 0.0765 0.1091 0.0765 0.1068 ...
 $ Te_intra   : num  0.144 0.144 0.1237 0.1237 0.0695 ...
 $ Tu_inter   : num  0.0794 0.098 0.0976 0.0979 0.0826 ...
 $ Te_inter   : num  0.209 0.175 0.15 0.203 0.157 ...
str(ca)
'data.frame':   3451 obs. of  42 variables:
 $ Block                       : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Rep                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Box                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Leaf                        : int  3 4 3 4 3 4 3 4 3 4 ...
 $ Disk                        : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Env                         : chr  "N" "N" "Cd" "Cd" ...
 $ FocalSR                     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR                      : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens                        : int  1 1 1 1 2 2 2 2 4 4 ...
 $ Type                        : chr  "INTRA" "INTRA" "INTRA" "INTRA" ...
 $ Focalfemale                 : chr  "Te" "Te" "Te" "Te" ...
 $ FocalDead                   : int  0 0 1 0 1 1 0 0 0 0 ...
 $ FocalDrowned                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ FocalMissing                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumbDeadComp                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumberOfEggs                : int  11 21 3 9 15 16 17 11 58 24 ...
 $ NumberOfEggsBelow           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ TeMales                     : int  3 3 0 3 2 5 5 3 8 8 ...
 $ TeFemales                   : int  6 9 2 5 2 10 4 4 9 6 ...
 $ TeQuiescentfemales          : int  0 0 0 0 0 0 3 0 3 4 ...
 $ TuMales                     : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuFemales                   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuQuiescentfemales          : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Observations                : chr  NA NA NA NA ...
 $ Block2                      : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ Rep2                        : Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Disk2                       : Factor w/ 16 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Leaf2                       : Factor w/ 2 levels "3","4": 1 2 1 2 1 2 1 2 1 2 ...
 $ Env2                        : Factor w/ 2 levels "Cd","N": 2 2 1 1 2 2 1 1 2 2 ...
 $ FocalSR2                    : Factor w/ 4 levels "1","2","4","5": 3 3 3 3 3 3 3 3 3 3 ...
 $ CompSR2                     : Factor w/ 4 levels "1","2","4","5": NA NA NA NA NA NA NA NA NA NA ...
 $ Type2                       : Factor w/ 2 levels "INTER","INTRA": 2 2 2 2 2 2 2 2 2 2 ...
 $ Focal_Female2               : Factor w/ 2 levels "Te","Tu": 1 1 1 1 1 1 1 1 1 1 ...
 $ Nr_Focal_Females_Tu_Alive_G0: num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_Te_Alive_G0: num  1 1 0 1 1 1 2 2 4 4 ...
 $ Num_Comp_Tu_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Num_Comp_Te_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_G0         : num  1 1 1 1 2 2 2 2 4 4 ...
 $ Nr_Comp_Females_G0          : num  0 0 0 0 1 1 1 1 3 3 ...
 $ GrowthRateOA                : num  6 9 2 5 1 5 2 2 2.25 1.5 ...
 $ GrowthRateOA_Q              : num  6 9 2 5 1 5 3.5 2 3 2.5 ...
 $ Replicate                   : chr  "1" "1" "1" "1" ...
rk_func<- function(lambda, alpha_ii, alpha_ij, dens_i, dens_j, ...){
  gr<-lambda*exp(-alpha_ii*dens_i - alpha_ij*dens_j)
  
  return(gr)
}

red_ca_C<-ca[,c("Env", "Rep", "FocalSR", "CompSR", "Dens", "Type", "TeFemales", "TuFemales", "GrowthRateOA")]

red_ca_C

red_ca_C$Dens_Focal<-sapply(c(1:length(red_ca_C[,1])), function(x){
  if(red_ca_C$Type[x]=="INTRA"){
    a<-red_ca_C$Dens[x]-1
  }else if(red_ca_C$Type[x]=="INTER"){
    a<-1
  }
  
  a
})

red_ca_C$Dens_Comp<-sapply(c(1:length(red_ca_C[,1])), function(x){
  if(red_ca_C$Type[x]=="INTRA"){
    a<-0
  }else if(red_ca_C$Type[x]=="INTER"){
    a<-red_ca_C$Dens[x]-1
  }
  
  a
})

red_ca_C$Focal<-mapvalues(red_ca_C$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4", "SR5"))
red_ca_C$Comp<-mapvalues(red_ca_C$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4", "SR5"))

red_ca_C$pred<-sapply(c(1:length(red_ca_C[,1])), function(x){
  
  if(red_ca_C$Focal[x]=="SR1" | red_ca_C$Focal[x]=="SR2"){
    aux_data<-subset(param_all_C, Environment==red_ca_C$Env[x] & Replicate== red_ca_C$Rep[x] & as.character(Tu_Regime)==red_ca_C$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Tu_lambda[1], alpha_ii =aux_data$Tu_intra[1], alpha_ij = aux_data$Tu_inter[1], dens_i = red_ca_C$Dens_Focal[x], dens_j =  red_ca_C$Dens_Comp[x])
    
  }else if(red_ca_C$Focal[x]=="SR4" | red_ca_C$Focal[x]=="SR5"){
    aux_data<-subset(param_all_C, Environment==red_ca_C$Env[x] & Replicate== red_ca_C$Rep[x] & as.character(Te_Regime)==red_ca_C$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Te_lambda[1], alpha_ii =aux_data$Te_intra[1], alpha_ij = aux_data$Te_inter[1], dens_i = red_ca_C$Dens_Focal[x], dens_j =  red_ca_C$Dens_Comp[x])
  }
  
  aux_pred
})

red_ca_C$pred_L<-sapply(c(1:length(red_ca_C[,1])), function(x){
  
  if(red_ca_C$Focal[x]=="SR1" | red_ca_C$Focal[x]=="SR2"){
    aux_data<-subset(param_all_C_lower, Environment==red_ca_C$Env[x] & Replicate== red_ca_C$Rep[x] & as.character(Tu_Regime)==red_ca_C$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Tu_lambda[1], alpha_ii =aux_data$Tu_intra[1], alpha_ij = aux_data$Tu_inter[1], dens_i = red_ca_C$Dens_Focal[x], dens_j =  red_ca_C$Dens_Comp[x])
    
  }else if(red_ca_C$Focal[x]=="SR4" | red_ca_C$Focal[x]=="SR5"){
    aux_data<-subset(param_all_C_lower, Environment==red_ca_C$Env[x] & Replicate== red_ca_C$Rep[x] & as.character(Te_Regime)==red_ca_C$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Te_lambda[1], alpha_ii =aux_data$Te_intra[1], alpha_ij = aux_data$Te_inter[1], dens_i = red_ca_C$Dens_Focal[x], dens_j =  red_ca_C$Dens_Comp[x])
  }
  
  aux_pred
})

red_ca_C$pred_U<-sapply(c(1:length(red_ca_C[,1])), function(x){
  
  if(red_ca_C$Focal[x]=="SR1" | red_ca_C$Focal[x]=="SR2"){
    aux_data<-subset(param_all_C_upper, Environment==red_ca_C$Env[x] & Replicate== red_ca_C$Rep[x] & as.character(Tu_Regime)==red_ca_C$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Tu_lambda[1], alpha_ii =aux_data$Tu_intra[1], alpha_ij = aux_data$Tu_inter[1], dens_i = red_ca_C$Dens_Focal[x], dens_j =  red_ca_C$Dens_Comp[x])
    
  }else if(red_ca_C$Focal[x]=="SR4" | red_ca_C$Focal[x]=="SR5"){
    aux_data<-subset(param_all_C_upper, Environment==red_ca_C$Env[x] & Replicate== red_ca_C$Rep[x] & as.character(Te_Regime)==red_ca_C$Focal[x])
    
    aux_pred<-rk_func(lambda=aux_data$Te_lambda[1], alpha_ii =aux_data$Te_intra[1], alpha_ij = aux_data$Te_inter[1], dens_i = red_ca_C$Dens_Focal[x], dens_j =  red_ca_C$Dens_Comp[x])
  }
  
  aux_pred
})

red_ca_C$Replicate<-red_ca_C$Rep
str(red_ca_C)
'data.frame':   3451 obs. of  17 variables:
 $ Env         : chr  "N" "N" "Cd" "Cd" ...
 $ Rep         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ FocalSR     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR      : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens        : int  1 1 1 1 2 2 2 2 4 4 ...
 $ Type        : chr  "INTRA" "INTRA" "INTRA" "INTRA" ...
 $ TeFemales   : int  6 9 2 5 2 10 4 4 9 6 ...
 $ TuFemales   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ GrowthRateOA: num  6 9 2 5 1 5 2 2 2.25 1.5 ...
 $ Dens_Focal  : num  0 0 0 0 1 1 1 1 3 3 ...
 $ Dens_Comp   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ Focal       : chr  "SR4" "SR4" "SR4" "SR4" ...
 $ Comp        : chr  NA NA NA NA ...
 $ pred        : num  11.11 11.11 3.3 3.3 9.62 ...
 $ pred_L      : num  6.41 6.41 1.41 1.41 5.67 ...
 $ pred_U      : num  15.81 15.81 5.19 5.19 13.4 ...
 $ Replicate   : int  1 1 1 1 1 1 1 1 1 1 ...
ggplot(subset(red_ca_C, Env=="N" & FocalSR==1), aes(x=log(GrowthRateOA+1), y=log(pred+1)))+
  facet_grid(CompSR~Replicate)+
  geom_abline(slope = 1, intercept=0)+
  geom_point()+
  ylab("Predicted")+
  xlab("Observed")+
  ggtitle("Normal environment Control urticae")


ggplot(subset(red_ca_C, Env=="N" & FocalSR==1), aes(x=GrowthRateOA, y=pred))+
  facet_grid(CompSR~Replicate)+
  geom_abline(slope = 1, intercept=0)+
  geom_point()+
  ylab("Predicted")+
  xlab("Observed")+
  ggtitle("Normal environment Control urticae")

NA
NA
NA

D - optim normal

Estimating parameters

# creating folder to put the analyses inside, this should be the same as the file path in the function
dir.create("./NewAnalyses/Optim_normal", showWarnings = FALSE)

source("./function_riker_27May.R")
# This matrix has all the comparisons that need to be done between regimes
comparison_mat<-matrix(nrow=4, ncol=3)
  comparison_mat[1,]<-c(1,4,5)
  comparison_mat[2,]<-c(2,4,5)
  comparison_mat[3,]<-c(4,1,2)
  comparison_mat[4,]<-c(5,1,2)

#lam2 is the data from density one corresponding to the focals populations
# data2 is the data (format) Regime (name of focal pop), background (name of competitor, the same if its intraspecific competition), focal (number of focal individuals in g0), comp (number of competitors in g0), growth rate
  # Attention that for intraspecific you need to add 0 in the comp and all individuals in the focal
  
  

rep2<-mod_df(subset(ca,Rep==1 & Env=="N"))  
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/",data2=rep2, reps2=1, env="N", comparisons = comparison_mat)
[1] "5 model 0 converged on rep 1"
Warning: NaNs produced
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==1 & Env=="Cd"))
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/", lam2=dataForLambda, data2=rep2, reps2=1, env="Cd", comparisons = comparison_mat)
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==3 & Env=="N"))
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/", lam2=dataForLambda, data2=rep2, reps2=3, env="N", comparisons = comparison_mat)
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==3 & Env=="Cd"))
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/", lam2=dataForLambda, data2=rep2, reps2=3, env="Cd", comparisons = comparison_mat)
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==4 & Env=="N"))
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/", lam2=dataForLambda, data2=rep2, reps2=4, env="N", comparisons = comparison_mat)
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==4 & Env=="Cd"))
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/", lam2=dataForLambda, data2=rep2, reps2=4, env="Cd", comparisons = comparison_mat)
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==5 & Env=="N"))
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/", lam2=dataForLambda, data2=rep2, reps2=5, env="N", comparisons = comparison_mat)
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==5 & Env=="Cd"))
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/", lam2=dataForLambda, data2=rep2, reps2=5, env="Cd", comparisons = comparison_mat)
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 0 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
# For two we have to change the comparison matrix
comparison_mat2<-matrix(nrow=3, ncol=3)
  comparison_mat2[1,]<-c(1,4,5)
  comparison_mat2[2,]<-c(4,1,NA)
  comparison_mat2[3,]<-c(5,1,NA)

rep2<-mod_df(subset(ca,Rep==2 & Env=="N"))
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/", lam2=dataForLambda, data2=rep2, reps2=2, env="N", comparisons = comparison_mat2)
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "1 model 0 converged on rep 1"
[1] "1 model 2 converged on rep 1"
[1] "1 model 3 converged on rep 1"
[1] "1 model 0 converged on rep 1"
[1] "1 model 2 converged on rep 1"
[1] "1 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==2 & Env=="Cd"))
magic_rk(filepath2 = "./NewAnalyses/Optim_normal/", lam2=dataForLambda, data2=rep2, reps2=2, env="Cd", comparisons = comparison_mat2)
[1] "5 model 0 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "1 model 0 converged on rep 1"
[1] "1 model 2 converged on rep 1"
[1] "1 model 3 converged on rep 1"
[1] "1 model 0 converged on rep 1"
[1] "1 model 2 converged on rep 1"
[1] "1 model 3 converged on rep 1"
Importing files of alpha and lambda
alpha_file<-list.files("./NewAnalyses/Optim_normal/", pattern="alpha_estimates") #the alphas are always tu, te (row), tu, te (col)

alphaUpper_file<-list.files("./NewAnalyses/Optim_normal/", pattern="alpha_upper")

alphaLower_file<-list.files("./NewAnalyses/Optim_normal/", pattern="alpha_lower")

lambda_file<-list.files("./NewAnalyses/Optim_normal/", pattern="lambda_estimates")


alpha_list<- lapply(alpha_file, function(x) read.csv(paste("./NewAnalyses/Optim_normal/",x, sep=""), header = TRUE))
alphaUpper_list<- lapply(alphaUpper_file, function(x) read.csv(paste("./NewAnalyses/Optim_normal/",x, sep=""), header = TRUE))
alphaLower_list<- lapply(alphaLower_file, function(x) read.csv(paste("./NewAnalyses/Optim_normal/",x, sep=""), header = TRUE))
lambda_list<- lapply(lambda_file, function(x) read.csv(paste("./NewAnalyses/Optim_normal/",x, sep=""), header = TRUE))

# passing from list to data frame
# First we need to do the first iteration (to create everything)
lambda_intra_fixed<-data.frame(Regime1=rep(c(1,1,2,2),10), Regime2=rep(c(4,5,4,5), 10), Replicate=c(rep(1,8),rep(2,8),rep(3,8),rep(4,8),rep(5,8)), Env=rep(c(rep("N",4), rep("Cd",4)), 5))

lambda_intra_fixed<-lambda_intra_fixed[-which(lambda_intra_fixed$Regime1==2 & lambda_intra_fixed$Replicate==2),] # to remove SR2 from replicate 2 because it does not exist

alpha_list[[1]]
lambda_list[[1]]

# passing alphas to dataframe
repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[1], split="_")[1])[6], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[1], split="_")[1])[6], split="[.]"))[1],split=""))[2]
  
regimeTu<-c("1","1", "2","2")
regimeTe<-c("4","5", "4","5")
Env<-rep(env, 4)
Rep<-rep(repli,4)

aux_alpha<-as.data.frame(alpha_list[[1]])

aux_alpha2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu=c(aux_alpha[1,2], aux_alpha[1,2], aux_alpha[2,2],aux_alpha[2,2]), intraTe=c(aux_alpha[3,2], aux_alpha[4,2], aux_alpha[3,2],aux_alpha[4,2]), interTu=c(aux_alpha[1,3], aux_alpha[1,4], aux_alpha[2,3], aux_alpha[2,4]), interTe=c(aux_alpha[3,3], aux_alpha[4,3], aux_alpha[3,4], aux_alpha[4,4]))

for(x in 2:length(lambda_list)){
  repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[x], split="_")[1])[6], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[x], split="_")[1])[6], split="[.]"))[1],split=""))[2]
  
  if(x==3 | x==4){# because there is no SR2 here
    regimeTu<-c("1","1")
    regimeTe<-c("4","5")
    Env<-rep(env, 2)
    Rep<-rep(repli,2)
    
    aux_alpha<-as.data.frame(alpha_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu=c(aux_alpha[1,2], aux_alpha[1,2]), intraTe=c(aux_alpha[2,2], aux_alpha[3,2]), interTu=c(aux_alpha[1,3], aux_alpha[1,4]), interTe=c(aux_alpha[2,3], aux_alpha[3,3]))
    
    
  }else{
    regimeTu<-c("1","1", "2","2")
    regimeTe<-c("4","5", "4","5")
    Env<-rep(env, 4)
    Rep<-rep(repli,4)
    
    aux_alpha<-as.data.frame(alpha_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu=c(aux_alpha[1,2], aux_alpha[1,2], aux_alpha[2,2],aux_alpha[2,2]), intraTe=c(aux_alpha[3,2], aux_alpha[4,2], aux_alpha[3,2],aux_alpha[4,2]), interTu=c(aux_alpha[1,3], aux_alpha[1,4], aux_alpha[2,3], aux_alpha[2,4]), interTe=c(aux_alpha[3,3], aux_alpha[4,3], aux_alpha[3,4], aux_alpha[4,4]))
  }
  
  aux_alpha2<-rbind(aux_alpha2, aux2)
}

### Alpha Lower

# passing alphas to dataframe
repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaLower_file[1], split="_")[1])[4], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaLower_file[1], split="_")[1])[4], split="[.]"))[1],split=""))[2]
  
regimeTu<-c("1","1", "2","2")
regimeTe<-c("4","5", "4","5")
Env<-rep(env, 4)
Rep<-rep(repli,4)

aux_alphaLower<-as.data.frame(alphaLower_list[[1]])

aux_alphaLower2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_L=c(aux_alphaLower[1,2], aux_alphaLower[1,2], aux_alphaLower[2,2],aux_alphaLower[2,2]), intraTe_L=c(aux_alphaLower[3,2], aux_alphaLower[4,2], aux_alphaLower[3,2],aux_alphaLower[4,2]), interTu_L=c(aux_alphaLower[1,3], aux_alphaLower[1,4], aux_alphaLower[2,3], aux_alphaLower[2,4]), interTe_L=c(aux_alphaLower[3,3], aux_alphaLower[4,3], aux_alphaLower[3,4], aux_alphaLower[4,4]))

for(x in 2:length(lambda_list)){
  repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaLower_file[x], split="_")[1])[4], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaLower_file[x], split="_")[1])[4], split="[.]"))[1],split=""))[2]
  
  if(x==3 | x==4){# because there is no SR2 here
    regimeTu<-c("1","1")
    regimeTe<-c("4","5")
    Env<-rep(env, 2)
    Rep<-rep(repli,2)
    
    aux_alphaLower<-as.data.frame(alphaLower_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_L=c(aux_alphaLower[1,2], aux_alphaLower[1,2]), intraTe_L=c(aux_alphaLower[2,2], aux_alphaLower[3,2]), interTu_L=c(aux_alphaLower[1,3], aux_alphaLower[1,4]), interTe_L=c(aux_alphaLower[2,3], aux_alphaLower[3,3]))
    
    
  }else{
    regimeTu<-c("1","1", "2","2")
    regimeTe<-c("4","5", "4","5")
    Env<-rep(env, 4)
    Rep<-rep(repli,4)
    
    aux_alphaLower<-as.data.frame(alphaLower_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_L=c(aux_alphaLower[1,2], aux_alphaLower[1,2], aux_alphaLower[2,2],aux_alphaLower[2,2]), intraTe_L=c(aux_alphaLower[3,2], aux_alphaLower[4,2], aux_alphaLower[3,2],aux_alphaLower[4,2]), interTu_L=c(aux_alphaLower[1,3], aux_alphaLower[1,4], aux_alphaLower[2,3], aux_alphaLower[2,4]), interTe_L=c(aux_alphaLower[3,3], aux_alphaLower[4,3], aux_alphaLower[3,4], aux_alphaLower[4,4]))
  }
  
  aux_alphaLower2<-rbind(aux_alphaLower2, aux2)
}

### Alpha Upper

# passing alphas to dataframe
repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaUpper_file[1], split="_")[1])[4], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaUpper_file[1], split="_")[1])[4], split="[.]"))[1],split=""))[2]
  
regimeTu<-c("1","1", "2","2")
regimeTe<-c("4","5", "4","5")
Env<-rep(env, 4)
Rep<-rep(repli,4)

aux_alphaUpper<-as.data.frame(alphaUpper_list[[1]])

aux_alphaUpper2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_U=c(aux_alphaUpper[1,2], aux_alphaUpper[1,2], aux_alphaUpper[2,2],aux_alphaUpper[2,2]), intraTe_U=c(aux_alphaUpper[3,2], aux_alphaUpper[4,2], aux_alphaUpper[3,2],aux_alphaUpper[4,2]), interTu_U=c(aux_alphaUpper[1,3], aux_alphaUpper[1,4], aux_alphaUpper[2,3], aux_alphaUpper[2,4]), interTe_U=c(aux_alphaUpper[3,3], aux_alphaUpper[4,3], aux_alphaUpper[3,4], aux_alphaUpper[4,4]))

for(x in 2:length(lambda_list)){
  repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaUpper_file[x], split="_")[1])[4], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaUpper_file[x], split="_")[1])[4], split="[.]"))[1],split=""))[2]
  
  if(x==3 | x==4){# because there is no SR2 here
    regimeTu<-c("1","1")
    regimeTe<-c("4","5")
    Env<-rep(env, 2)
    Rep<-rep(repli,2)
    
    aux_alphaUpper<-as.data.frame(alphaUpper_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_U=c(aux_alphaUpper[1,2], aux_alphaUpper[1,2]), intraTe_U=c(aux_alphaUpper[2,2], aux_alphaUpper[3,2]), interTu_U=c(aux_alphaUpper[1,3], aux_alphaUpper[1,4]), interTe_U=c(aux_alphaUpper[2,3], aux_alphaUpper[3,3]))
    
    
  }else{
    regimeTu<-c("1","1", "2","2")
    regimeTe<-c("4","5", "4","5")
    Env<-rep(env, 4)
    Rep<-rep(repli,4)
    
    aux_alphaUpper<-as.data.frame(alphaUpper_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_U=c(aux_alphaUpper[1,2], aux_alphaUpper[1,2], aux_alphaUpper[2,2],aux_alphaUpper[2,2]), intraTe_U=c(aux_alphaUpper[3,2], aux_alphaUpper[4,2], aux_alphaUpper[3,2],aux_alphaUpper[4,2]), interTu_U=c(aux_alphaUpper[1,3], aux_alphaUpper[1,4], aux_alphaUpper[2,3], aux_alphaUpper[2,4]), interTe_U=c(aux_alphaUpper[3,3], aux_alphaUpper[4,3], aux_alphaUpper[3,4], aux_alphaUpper[4,4]))
  }
  
  aux_alphaUpper2<-rbind(aux_alphaUpper2, aux2)
}

# Passing lambda to data frame
repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[1], split="_")[1])[6], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[1], split="_")[1])[6], split="[.]"))[1],split=""))[2]
  
Focal<-c("1","1","2","2","4","4","5","5")
Comp<-c("4","5","4","5","1","2","1","2")
Env<-rep(env, 8)
Rep<-rep(repli,8)
    
aux_lambda<-cbind(as.data.frame(lambda_list[[1]])[,c(3,4,5)],Focal,Comp, Env, Rep)

for(x in 2:length(lambda_list)){
  repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[x], split="_")[1])[6], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[x], split="_")[1])[6], split="[.]"))[1],split=""))[2]
  
  if(x==3 | x==4){# because there is no SR2 here
    Focal<-c("1","1","4","5")
    Comp<-c("4","5","1","1")
    Env<-rep(env, 4)
    Rep<-rep(repli,4)
    
    aux<-cbind(as.data.frame(lambda_list[[x]])[,c(3,4,5)],Focal,Comp, Env, Rep)
    
  }else{
    Focal<-c("1","1","2","2","4","4","5","5")
    Comp<-c("4","5","4","5","1","2","1","2")
    Env<-rep(env, 8)
    Rep<-rep(repli,8)
    
    aux<-cbind(as.data.frame(lambda_list[[x]])[,c(3,4,5)],Focal,Comp, Env, Rep)
  }
  
  aux_lambda<-rbind(aux_lambda, aux)
}


#Matching all the data

alphas_mat_D<-as.data.frame(cbind(aux_alpha2, aux_alphaLower2, aux_alphaUpper2))

str(lambda_intra_fixed)
'data.frame':   36 obs. of  4 variables:
 $ Regime1  : num  1 1 2 2 1 1 2 2 1 1 ...
 $ Regime2  : num  4 5 4 5 4 5 4 5 4 5 ...
 $ Replicate: num  1 1 1 1 1 1 1 1 2 2 ...
 $ Env      : chr  "N" "N" "N" "N" ...
#### adding lambda

alphas_mat_D$lambdaTu<-sapply(c(1:length(alphas_mat_D[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_D$regimeTu[x] & Comp==alphas_mat_D$regimeTe[x]) & Rep==alphas_mat_D$Rep[x] & Env==alphas_mat_D$Env[x] )
  
  auxi[1,1]
})

alphas_mat_D$lambdaTe<-sapply(c(1:length(alphas_mat_D[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_D$regimeTe[x] & Comp==alphas_mat_D$regimeTu[x]) & Rep==alphas_mat_D$Rep[x] & Env==alphas_mat_D$Env[x] )
  
  auxi[1,1]
})


alphas_mat_D$lambdaTu_L<-sapply(c(1:length(alphas_mat_D[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_D$regimeTu[x] & Comp==alphas_mat_D$regimeTe[x]) & Rep==alphas_mat_D$Rep[x] & Env==alphas_mat_D$Env[x] )
  
  auxi[1,2]
})

alphas_mat_D$lambdaTe_L<-sapply(c(1:length(alphas_mat_D[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_D$regimeTe[x] & Comp==alphas_mat_D$regimeTu[x]) & Rep==alphas_mat_D$Rep[x] & Env==alphas_mat_D$Env[x] )
  
  auxi[1,2]
})

alphas_mat_D$lambdaTu_U<-sapply(c(1:length(alphas_mat_D[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_D$regimeTu[x] & Comp==alphas_mat_D$regimeTe[x]) & Rep==alphas_mat_D$Rep[x] & Env==alphas_mat_D$Env[x] )
  
  auxi[1,3]
})

alphas_mat_D$lambdaTe_U<-sapply(c(1:length(alphas_mat_D[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_D$regimeTe[x] & Comp==alphas_mat_D$regimeTu[x]) & Rep==alphas_mat_D$Rep[x] & Env==alphas_mat_D$Env[x] )
  
  auxi[1,3]
})

alphas_mat_D$Env2<-mapvalues(alphas_mat_D$Env, c("C","N"), c("Cd","N"))

# clean up the matrix, because it has a lot of repeated columns
alphas_mat_D<-alphas_mat_D[,c(1:8, 13:16,21:30)]

alphas_mat_D
NA

Plotting data

### Plotting data

colnames(alphas_mat_D)<-c("Tu_Regime", "Te_Regime", "Environment", "Replicate", "Tu_intra", "Te_intra", "Tu_inter", "Te_inter", "Tu_intra_L", "Te_intra_L", "Tu_inter_L", "Te_inter_L", "Tu_intra_U", "Te_intra_U", "Tu_inter_U", "Te_inter_U", "Tu_lambda", "Te_lambda","Tu_lambda_L", "Te_lambda_L","Tu_lambda_U", "Te_lambda_U")


alphas_mat_D_long<-gather(alphas_mat_D, parameter, value,Tu_intra:Te_lambda_U )

alphas_mat_D_long$category<-mapvalues(alphas_mat_D_long$parameter, c("Tu_intra", "Te_intra", "Tu_inter", "Te_inter", "Tu_intra_L", "Te_intra_L", "Tu_inter_L", "Te_inter_L", "Tu_intra_U", "Te_intra_U", "Tu_inter_U", "Te_inter_U", "Tu_lambda", "Te_lambda","Tu_lambda_L", "Te_lambda_L","Tu_lambda_U", "Te_lambda_U"), c("intra", "intra", "inter", "inter", "intra_L", "intra_L", "inter_L", "inter_L","intra_U", "intra_U", "inter_U", "inter_U","lambda","lambda","lambda_L","lambda_L","lambda_U","lambda_U"))

str(alphas_mat_D_long)
'data.frame':   648 obs. of  7 variables:
 $ Tu_Regime  : chr  "1" "1" "2" "2" ...
 $ Te_Regime  : chr  "4" "5" "4" "5" ...
 $ Environment: chr  "C" "C" "C" "C" ...
 $ Replicate  : chr  "1" "1" "1" "1" ...
 $ parameter  : chr  "Tu_intra" "Tu_intra" "Tu_intra" "Tu_intra" ...
 $ value      : num  0.0252 0.0252 0.0285 0.0285 0.0785 ...
 $ category   : chr  "intra" "intra" "intra" "intra" ...
###########


ggplot(subset(alphas_mat_D_long, parameter=="Te_intra" & Tu_Regime=="1" & Environment=="C"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")

save_plot("./NewAnalyses/Optim_normal/26May_RK_intraTe_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(alphas_mat_D_long, parameter=="Te_intra" & Tu_Regime=="1" & Environment=="N"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/Optim_normal/26May_RK_intraTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(alphas_mat_D_long, parameter=="Tu_intra" & Te_Regime=="4" & Environment=="C"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/Optim_normal/26May_RK_intraTu_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(alphas_mat_D_long, parameter=="Tu_intra" & Te_Regime=="4" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/Optim_normal/26May_RK_intraTu_w0_rep_N.pdf", width=20, height=15)


######## INTER

ggplot(subset(alphas_mat_D_long, parameter=="Te_inter" & Environment=="C"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  facet_grid(.~Tu_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_x_discrete(labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Selection regime T. evansi")+
  ggtitle("Environment: cadmium")
save_plot("./NewAnalyses/Optim_normal/26May_RK_interTe_w0_rep_Cd.pdf", width=20, height=15)


ggplot(subset(alphas_mat_D_long, parameter=="Te_inter" & Environment=="N"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  facet_grid(.~Tu_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_x_discrete(labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Selection regime T. evansi")+
  ggtitle("Environment: control")
save_plot("./NewAnalyses/Optim_normal/26May_RK_interTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(alphas_mat_D_long, parameter=="Tu_inter" & Environment=="C"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  facet_grid(.~Te_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75), aes(shape=Replicate))+
  theme_ines+
 scale_x_discrete(labels=c("Control", "Evolved"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Selection regime T. urticae")+
  ggtitle("Environment: cadmium")
save_plot("./NewAnalyses/Optim_normal/26May_RK_interTu_w0_rep_Cd.pdf", width=20, height=15)


ggplot(subset(alphas_mat_D_long, parameter=="Tu_inter" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  facet_grid(.~Te_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75), aes(shape=Replicate))+
  theme_ines+
  scale_x_discrete(labels=c("Control", "Evolved"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Selection regime T. urticae")+
  ggtitle("Environment: control")
save_plot("./NewAnalyses/Optim_normal/26May_RK_interTu_w0_rep_N.pdf", width=20, height=15)


######### Lambda

ggplot(subset(alphas_mat_D_long, parameter=="Te_lambda" & Tu_Regime=="1" & Environment=="C"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. evansi)")+
  xlab("Selection regime T. evansi")+
  ggtitle("Environment: cadmium")
save_plot("./NewAnalyses/Optim_normal/26May_RK_lambdaTe_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(alphas_mat_D_long, parameter=="Te_lambda" & Tu_Regime=="1" & Environment=="N"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. evansi)")+
    xlab("Selection regime T. evansi")+
  ggtitle("Environment: control")
save_plot("./NewAnalyses/Optim_normal/26May_RK_lambdaTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(alphas_mat_D_long, parameter=="Tu_lambda" & Te_Regime=="4" & Environment=="C"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Selection regime T. urticae")+
  ggtitle("Environment: cadmium")
save_plot("./NewAnalyses/Optim_normal/26May_RK_lambdaTu_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(alphas_mat_D_long, parameter=="Tu_lambda" & Te_Regime=="4" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Selection regime T. urticae")+
  ggtitle("Environment: control")
save_plot("./NewAnalyses/Optim_normal/26May_RK_lambdaTu_w0_rep_N.pdf", width=20, height=15)

NA
NA
Predicting data
str(alphas_mat_D)
'data.frame':   36 obs. of  22 variables:
 $ Tu_Regime  : chr  "1" "1" "2" "2" ...
 $ Te_Regime  : chr  "4" "5" "4" "5" ...
 $ Environment: chr  "C" "C" "C" "C" ...
 $ Replicate  : chr  "1" "1" "1" "1" ...
 $ Tu_intra   : num  0.0252 0.0252 0.0285 0.0285 0.0785 ...
 $ Te_intra   : num  0.0778 0.0914 0.0778 0.0914 0.1529 ...
 $ Tu_inter   : num  0.04392 0.03232 0.00834 0.0142 0.03398 ...
 $ Te_inter   : num  0.0273 0.072 0.0596 0.0419 0.1961 ...
 $ Tu_intra_L : num  -0.00367 -0.00367 -0.00163 -0.00163 0.04236 ...
 $ Te_intra_L : num  0.0472 0.052 0.0472 0.052 0.1151 ...
 $ Tu_inter_L : num  0.0231 0.0101 -0.0232 -0.018 -0.0265 ...
 $ Te_inter_L : num  -0.03664 0.02552 0.00625 -0.01089 0.11837 ...
 $ Tu_intra_U : num  0.054 0.054 0.0586 0.0586 0.1146 ...
 $ Te_intra_U : num  0.109 0.131 0.109 0.131 0.191 ...
 $ Tu_inter_U : num  0.0647 0.0545 0.0398 0.0464 0.0945 ...
 $ Te_inter_U : num  0.0913 0.1184 0.1129 0.0947 0.2738 ...
 $ Tu_lambda  : num  0.0252 0.0252 0.0285 0.0285 0.0785 ...
 $ Te_lambda  : num  0.0778 0.0914 0.0778 0.0914 0.1529 ...
 $ Tu_lambda_L: num  1.007 1.007 0.795 0.795 1.421 ...
 $ Te_lambda_L: num  1.682 0.869 1.682 0.869 7.339 ...
 $ Tu_lambda_U: num  1.82 1.82 2.01 2.01 4.31 ...
 $ Te_lambda_U: num  3.84 5.53 3.84 5.53 13.05 ...
alphas_mat_D$Env2<-mapvalues(alphas_mat_D$Environment, c("C", "N"), c("Cd","N"))
str(ca)
'data.frame':   3451 obs. of  42 variables:
 $ Block                       : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Rep                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Box                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Leaf                        : int  3 4 3 4 3 4 3 4 3 4 ...
 $ Disk                        : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Env                         : chr  "N" "N" "Cd" "Cd" ...
 $ FocalSR                     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR                      : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens                        : int  1 1 1 1 2 2 2 2 4 4 ...
 $ Type                        : chr  "INTRA" "INTRA" "INTRA" "INTRA" ...
 $ Focalfemale                 : chr  "Te" "Te" "Te" "Te" ...
 $ FocalDead                   : int  0 0 1 0 1 1 0 0 0 0 ...
 $ FocalDrowned                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ FocalMissing                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumbDeadComp                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumberOfEggs                : int  11 21 3 9 15 16 17 11 58 24 ...
 $ NumberOfEggsBelow           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ TeMales                     : int  3 3 0 3 2 5 5 3 8 8 ...
 $ TeFemales                   : int  6 9 2 5 2 10 4 4 9 6 ...
 $ TeQuiescentfemales          : int  0 0 0 0 0 0 3 0 3 4 ...
 $ TuMales                     : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuFemales                   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuQuiescentfemales          : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Observations                : chr  NA NA NA NA ...
 $ Block2                      : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ Rep2                        : Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Disk2                       : Factor w/ 16 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Leaf2                       : Factor w/ 2 levels "3","4": 1 2 1 2 1 2 1 2 1 2 ...
 $ Env2                        : Factor w/ 2 levels "Cd","N": 2 2 1 1 2 2 1 1 2 2 ...
 $ FocalSR2                    : Factor w/ 4 levels "1","2","4","5": 3 3 3 3 3 3 3 3 3 3 ...
 $ CompSR2                     : Factor w/ 4 levels "1","2","4","5": NA NA NA NA NA NA NA NA NA NA ...
 $ Type2                       : Factor w/ 2 levels "INTER","INTRA": 2 2 2 2 2 2 2 2 2 2 ...
 $ Focal_Female2               : Factor w/ 2 levels "Te","Tu": 1 1 1 1 1 1 1 1 1 1 ...
 $ Nr_Focal_Females_Tu_Alive_G0: num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_Te_Alive_G0: num  1 1 0 1 1 1 2 2 4 4 ...
 $ Num_Comp_Tu_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Num_Comp_Te_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_G0         : num  1 1 1 1 2 2 2 2 4 4 ...
 $ Nr_Comp_Females_G0          : num  0 0 0 0 1 1 1 1 3 3 ...
 $ GrowthRateOA                : num  6 9 2 5 1 5 2 2 2.25 1.5 ...
 $ GrowthRateOA_Q              : num  6 9 2 5 1 5 3.5 2 3 2.5 ...
 $ Replicate                   : chr  "1" "1" "1" "1" ...
# Since the lambda is from the log data
ca$pred_D<-sapply(c(1:length(ca$Block)), function(x){
  if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR[x]) & Replicate==ca$Rep[x])$Tu_intra[1]
    alpha_ij<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Te_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Tu_inter[1]
    lambda<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_lambda[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_intra[1]
    alpha_ij<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Tu_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Te_inter[1]
    lambda<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_lambda[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*(densF))
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]
    pred<-lambda*exp(-alpha_ij*densC)
  }
    
  pred
  
})
x<-1
ca$pred_D_L<-sapply(c(1:length(ca$Block)), function(x){
  if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_intra_L[1]
    alpha_ij<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Te_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Tu_inter_L[1]
    lambda<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_lambda_L[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_intra_L[1]
    alpha_ij<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Tu_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Te_inter_L[1]
    lambda<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_lambda_L[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*(densF-1))
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]-1
    pred<-lambda*exp(-alpha_ij*densC)
  }
    
  pred
  
})

ca$pred_D_U<-sapply(c(1:length(ca$Block)), function(x){
 if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_intra_U[1]
    alpha_ij<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Te_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Tu_inter_U[1]
    lambda<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_lambda_U[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_intra_U[1]
    alpha_ij<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Tu_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Te_inter_U[1]
    lambda<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_lambda_U[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*(densF-1))
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]-1
    pred<-lambda*exp(-alpha_ij*densC)
  }
    
  pred
  
})
Predicting each density
density_aux<-seq(0, 10, by=(10/100))

pred_df_D<-as.data.frame(expand_grid(Density=density_aux, Tu_Regime=c(1,2), Te_Regime=c(4,5), Replicate=c(1:5), Environment=c("N", "C")))

pred_df_D$Tu_mean_intra<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_inter[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Tu_mean_inter<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_inter[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_D$Density[x])
    
    pred
})


pred_df_D$Tu_intra_L<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_intra_L[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_inter_L[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_lambda_L[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Tu_inter_L<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_intra_L[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_inter_L[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_lambda_L[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Tu_intra_U<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_intra_U[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_inter_U[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_lambda_U[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Tu_inter_U<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_intra_U[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_inter_U[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Replicate==pred_df_D$Replicate[x])$Tu_lambda_U[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Te_mean_intra<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_inter[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Te_mean_inter<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_inter[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Te_intra_L<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_intra_L[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_inter_L[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_lambda_L[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Te_inter_L<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_intra_L[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_inter_L[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_lambda_L[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Te_intra_U<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_intra_U[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_inter_U[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_lambda_U[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_D$Density[x])
    
    pred
})

pred_df_D$Te_inter_U<-sapply(c(1:length(pred_df_D[,1])), function(x){
   alpha_i<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_intra_U[1]
    alpha_ij<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Tu_Regime==pred_df_D$Tu_Regime[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_inter_U[1]
    lambda<-subset(alphas_mat_D, Environment==pred_df_D$Environment[x] & Te_Regime==pred_df_D$Te_Regime[x] & Replicate==pred_df_D$Replicate[x])$Te_lambda_U[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_D$Density[x])
    
    pred
})

# Removing Tu evolved replicate 2 because there is no data
pred_df_D<-pred_df_D[-which(pred_df_D$Tu_Regime==2 & pred_df_D$Replicate==2),]



# Transforming everything bellow 0 into 0 for the lower interval

pred_df_D$Te_inter_L[which(pred_df_D$Te_inter_L<0)]<-0
pred_df_D$Te_intra_L[which(pred_df_D$Te_intra_L<0)]<-0
pred_df_D$Tu_inter_L[which(pred_df_D$Tu_inter_L<0)]<-0
pred_df_D$Tu_intra_L[which(pred_df_D$Tu_intra_L<0)]<-0
Plotting predictions
CONTROL INTRA
ca$Replicate<-as.character(ca$Rep)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_D, Tu_Regime==1 & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_D, Tu_Regime==1 & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific control environment")
save_plot("./NewAnalyses/Optim_normal/pred_Tu_INTRA_Control_water.pdf", width=25, height=10)


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_D, Tu_Regime==1 & Environment=="C" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_D, Tu_Regime==1 & Environment=="C" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific cadmium environment")
save_plot("./NewAnalyses/Optim_normal/pred_Tu_INTRA_Control_cadmium.pdf", width=25, height=10)


#subset(pred_df_D, Tu_Regime==1 & Environment=="C" & Replicate==3)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_D, Te_Regime==4 & Environment=="N" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_D, Te_Regime==4 & Environment=="N" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific control environment")
save_plot("./NewAnalyses/Optim_normal/pred_Te_INTRA_Control_control.pdf", width=25, height=10)

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_D, Te_Regime==4 & Environment=="C" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_D, Te_Regime==4 & Environment=="C" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific cadmium environment")
save_plot("./NewAnalyses/Optim_normal/pred_Te_INTRA_Control_cadmium.pdf", width=25, height=10)

E - optim lambda fixed

Estimate parameters

# creating folder to put the analyses inside, this should be the same as the file path in the function
dir.create("./NewAnalyses/optim_lambda_fixed", showWarnings = FALSE)

source("./function_riker_27May.R")
# This matrix has all the comparisons that need to be done between regimes
comparison_mat<-matrix(nrow=4, ncol=3)
  comparison_mat[1,]<-c(1,4,5)
  comparison_mat[2,]<-c(2,4,5)
  comparison_mat[3,]<-c(4,1,2)
  comparison_mat[4,]<-c(5,1,2)
  

#lam2 is the data from density one corresponding to the focals populations
# data2 is the data (format) Regime (name of focal pop), background (name of competitor, the same if its intraspecific competition), focal (number of focal individuals in g0), comp (number of competitors in g0), growth rate
  # Attention that for intraspecific you need to add 0 in the comp and all individuals in the focal

rep2<-mod_df(subset(ca,Rep==1 & Env=="N"))  
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/",data2=rep2, reps2=1, env="N", comparisons = comparison_mat, lam2=subset(mean_dens1, Rep==1 & Env=="N"))
[1] "5 model 2 converged on rep 1"
Warning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs producedWarning: NaNs produced
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==1 & Env=="Cd"))
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/", data2=rep2, reps2=1, env="Cd", comparisons = comparison_mat, lam2=subset(mean_dens1, Rep==1 & Env=="Cd"))
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==3 & Env=="N"))
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/",  data2=rep2, reps2=3, env="N", comparisons = comparison_mat, lam2=subset(mean_dens1, Rep==3 & Env=="N"))
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==3 & Env=="Cd"))
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/", data2=rep2, reps2=3, env="Cd", comparisons = comparison_mat, lam2=subset(mean_dens1, Rep==3 & Env=="Cd"))
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==4 & Env=="N"))
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/", data2=rep2, reps2=4, env="N", comparisons = comparison_mat, lam2=subset(mean_dens1, Rep==4 & Env=="N"))
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==4 & Env=="Cd"))
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/", data2=rep2, reps2=4, env="Cd", comparisons = comparison_mat, lam2=subset(mean_dens1, Rep==4 & Env=="Cd"))
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==5 & Env=="N"))
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/", data2=rep2, reps2=5, env="N", comparisons = comparison_mat, lam2=subset(mean_dens1, Rep==5 & Env=="N"))
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==5 & Env=="Cd"))
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/",data2=rep2, reps2=5, env="Cd", comparisons = comparison_mat, lam2=subset(mean_dens1, Rep==5 & Env=="Cd"))
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 2 converged on rep 1"
[1] "2 model 3 converged on rep 1"
[1] "2 model 3 converged on rep 1"
# For two we have to change the comparison matrix
comparison_mat2<-matrix(nrow=3, ncol=3)
  comparison_mat2[1,]<-c(1,4,5)
  comparison_mat2[2,]<-c(4,1,NA)
  comparison_mat2[3,]<-c(5,1,NA)

rep2<-mod_df(subset(ca,Rep==2 & Env=="N"))
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/",  data2=rep2, reps2=2, env="N", comparisons = comparison_mat2, lam2=subset(mean_dens1, Rep==2 & Env=="N"))
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "1 model 2 converged on rep 1"
[1] "1 model 3 converged on rep 1"
[1] "1 model 2 converged on rep 1"
[1] "1 model 3 converged on rep 1"
rep2<-mod_df(subset(ca,Rep==2 & Env=="Cd"))
magic_rk_lambda(filepath2 = "./NewAnalyses/optim_lambda_fixed/",  data2=rep2, reps2=2, env="Cd", comparisons = comparison_mat2, lam2=subset(mean_dens1, Rep==2 & Env=="Cd"))
[1] "5 model 2 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "5 model 3 converged on rep 1"
[1] "1 model 2 converged on rep 1"
[1] "1 model 3 converged on rep 1"
[1] "1 model 2 converged on rep 1"
[1] "1 model 3 converged on rep 1"
Importing files of alpha and lambda
alpha_file<-list.files("./NewAnalyses/optim_lambda_fixed/", pattern="alpha_estimates") #the alphas are always tu, te (row), tu, te (col)

alphaUpper_file<-list.files("./NewAnalyses/optim_lambda_fixed/", pattern="alpha_upper")

alphaLower_file<-list.files("./NewAnalyses/optim_lambda_fixed/", pattern="alpha_lower")

lambda_file<-list.files("./NewAnalyses/optim_lambda_fixed/", pattern="lambda_estimates")


alpha_list<- lapply(alpha_file, function(x) read.csv(paste("./NewAnalyses/optim_lambda_fixed/",x, sep=""), header = TRUE))
alphaUpper_list<- lapply(alphaUpper_file, function(x) read.csv(paste("./NewAnalyses/optim_lambda_fixed/",x, sep=""), header = TRUE))
alphaLower_list<- lapply(alphaLower_file, function(x) read.csv(paste("./NewAnalyses/optim_lambda_fixed/",x, sep=""), header = TRUE))
lambda_list<- lapply(lambda_file, function(x) read.csv(paste("./NewAnalyses/optim_lambda_fixed/",x, sep=""), header = TRUE))

# passing from list to data frame
# First we need to do the first iteration (to create everything)
lambda_intra_fixed<-data.frame(Regime1=rep(c(1,1,2,2),10), Regime2=rep(c(4,5,4,5), 10), Replicate=c(rep(1,8),rep(2,8),rep(3,8),rep(4,8),rep(5,8)), Env=rep(c(rep("N",4), rep("Cd",4)), 5))

lambda_intra_fixed<-lambda_intra_fixed[-which(lambda_intra_fixed$Regime1==2 & lambda_intra_fixed$Replicate==2),] # to remove SR2 from replicate 2 because it does not exist

alpha_list[[1]]
lambda_list[[1]]

# passing alphas to dataframe
repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[1], split="_")[1])[6], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[1], split="_")[1])[6], split="[.]"))[1],split=""))[2]
  
regimeTu<-c("1","1", "2","2")
regimeTe<-c("4","5", "4","5")
Env<-rep(env, 4)
Rep<-rep(repli,4)

aux_alpha<-as.data.frame(alpha_list[[1]])

aux_alpha2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu=c(aux_alpha[1,2], aux_alpha[1,2], aux_alpha[2,2],aux_alpha[2,2]), intraTe=c(aux_alpha[3,2], aux_alpha[4,2], aux_alpha[3,2],aux_alpha[4,2]), interTu=c(aux_alpha[1,3], aux_alpha[1,4], aux_alpha[2,3], aux_alpha[2,4]), interTe=c(aux_alpha[3,3], aux_alpha[4,3], aux_alpha[3,4], aux_alpha[4,4]))

for(x in 2:length(lambda_list)){
  repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[x], split="_")[1])[6], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[x], split="_")[1])[6], split="[.]"))[1],split=""))[2]
  
  if(x==3 | x==4){# because there is no SR2 here
    regimeTu<-c("1","1")
    regimeTe<-c("4","5")
    Env<-rep(env, 2)
    Rep<-rep(repli,2)
    
    aux_alpha<-as.data.frame(alpha_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu=c(aux_alpha[1,2], aux_alpha[1,2]), intraTe=c(aux_alpha[2,2], aux_alpha[3,2]), interTu=c(aux_alpha[1,3], aux_alpha[1,4]), interTe=c(aux_alpha[2,3], aux_alpha[3,3]))
    
    
  }else{
    regimeTu<-c("1","1", "2","2")
    regimeTe<-c("4","5", "4","5")
    Env<-rep(env, 4)
    Rep<-rep(repli,4)
    
    aux_alpha<-as.data.frame(alpha_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu=c(aux_alpha[1,2], aux_alpha[1,2], aux_alpha[2,2],aux_alpha[2,2]), intraTe=c(aux_alpha[3,2], aux_alpha[4,2], aux_alpha[3,2],aux_alpha[4,2]), interTu=c(aux_alpha[1,3], aux_alpha[1,4], aux_alpha[2,3], aux_alpha[2,4]), interTe=c(aux_alpha[3,3], aux_alpha[4,3], aux_alpha[3,4], aux_alpha[4,4]))
  }
  
  aux_alpha2<-rbind(aux_alpha2, aux2)
}

### Alpha Lower

# passing alphas to dataframe
repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaLower_file[1], split="_")[1])[4], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaLower_file[1], split="_")[1])[4], split="[.]"))[1],split=""))[2]
  
regimeTu<-c("1","1", "2","2")
regimeTe<-c("4","5", "4","5")
Env<-rep(env, 4)
Rep<-rep(repli,4)

aux_alphaLower<-as.data.frame(alphaLower_list[[1]])

aux_alphaLower2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_L=c(aux_alphaLower[1,2], aux_alphaLower[1,2], aux_alphaLower[2,2],aux_alphaLower[2,2]), intraTe_L=c(aux_alphaLower[3,2], aux_alphaLower[4,2], aux_alphaLower[3,2],aux_alphaLower[4,2]), interTu_L=c(aux_alphaLower[1,3], aux_alphaLower[1,4], aux_alphaLower[2,3], aux_alphaLower[2,4]), interTe_L=c(aux_alphaLower[3,3], aux_alphaLower[4,3], aux_alphaLower[3,4], aux_alphaLower[4,4]))

for(x in 2:length(lambda_list)){
  repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaLower_file[x], split="_")[1])[4], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaLower_file[x], split="_")[1])[4], split="[.]"))[1],split=""))[2]
  
  if(x==3 | x==4){# because there is no SR2 here
    regimeTu<-c("1","1")
    regimeTe<-c("4","5")
    Env<-rep(env, 2)
    Rep<-rep(repli,2)
    
    aux_alphaLower<-as.data.frame(alphaLower_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_L=c(aux_alphaLower[1,2], aux_alphaLower[1,2]), intraTe_L=c(aux_alphaLower[2,2], aux_alphaLower[3,2]), interTu_L=c(aux_alphaLower[1,3], aux_alphaLower[1,4]), interTe_L=c(aux_alphaLower[2,3], aux_alphaLower[3,3]))
    
    
  }else{
    regimeTu<-c("1","1", "2","2")
    regimeTe<-c("4","5", "4","5")
    Env<-rep(env, 4)
    Rep<-rep(repli,4)
    
    aux_alphaLower<-as.data.frame(alphaLower_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_L=c(aux_alphaLower[1,2], aux_alphaLower[1,2], aux_alphaLower[2,2],aux_alphaLower[2,2]), intraTe_L=c(aux_alphaLower[3,2], aux_alphaLower[4,2], aux_alphaLower[3,2],aux_alphaLower[4,2]), interTu_L=c(aux_alphaLower[1,3], aux_alphaLower[1,4], aux_alphaLower[2,3], aux_alphaLower[2,4]), interTe_L=c(aux_alphaLower[3,3], aux_alphaLower[4,3], aux_alphaLower[3,4], aux_alphaLower[4,4]))
  }
  
  aux_alphaLower2<-rbind(aux_alphaLower2, aux2)
}

### Alpha Upper

# passing alphas to dataframe
repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaUpper_file[1], split="_")[1])[4], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaUpper_file[1], split="_")[1])[4], split="[.]"))[1],split=""))[2]
  
regimeTu<-c("1","1", "2","2")
regimeTe<-c("4","5", "4","5")
Env<-rep(env, 4)
Rep<-rep(repli,4)

aux_alphaUpper<-as.data.frame(alphaUpper_list[[1]])

aux_alphaUpper2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_U=c(aux_alphaUpper[1,2], aux_alphaUpper[1,2], aux_alphaUpper[2,2],aux_alphaUpper[2,2]), intraTe_U=c(aux_alphaUpper[3,2], aux_alphaUpper[4,2], aux_alphaUpper[3,2],aux_alphaUpper[4,2]), interTu_U=c(aux_alphaUpper[1,3], aux_alphaUpper[1,4], aux_alphaUpper[2,3], aux_alphaUpper[2,4]), interTe_U=c(aux_alphaUpper[3,3], aux_alphaUpper[4,3], aux_alphaUpper[3,4], aux_alphaUpper[4,4]))

for(x in 2:length(lambda_list)){
  repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaUpper_file[x], split="_")[1])[4], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alphaUpper_file[x], split="_")[1])[4], split="[.]"))[1],split=""))[2]
  
  if(x==3 | x==4){# because there is no SR2 here
    regimeTu<-c("1","1")
    regimeTe<-c("4","5")
    Env<-rep(env, 2)
    Rep<-rep(repli,2)
    
    aux_alphaUpper<-as.data.frame(alphaUpper_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_U=c(aux_alphaUpper[1,2], aux_alphaUpper[1,2]), intraTe_U=c(aux_alphaUpper[2,2], aux_alphaUpper[3,2]), interTu_U=c(aux_alphaUpper[1,3], aux_alphaUpper[1,4]), interTe_U=c(aux_alphaUpper[2,3], aux_alphaUpper[3,3]))
    
    
  }else{
    regimeTu<-c("1","1", "2","2")
    regimeTe<-c("4","5", "4","5")
    Env<-rep(env, 4)
    Rep<-rep(repli,4)
    
    aux_alphaUpper<-as.data.frame(alphaUpper_list[[x]])
    
    aux2<-data.frame(regimeTu, regimeTe, Env, Rep, intraTu_U=c(aux_alphaUpper[1,2], aux_alphaUpper[1,2], aux_alphaUpper[2,2],aux_alphaUpper[2,2]), intraTe_U=c(aux_alphaUpper[3,2], aux_alphaUpper[4,2], aux_alphaUpper[3,2],aux_alphaUpper[4,2]), interTu_U=c(aux_alphaUpper[1,3], aux_alphaUpper[1,4], aux_alphaUpper[2,3], aux_alphaUpper[2,4]), interTe_U=c(aux_alphaUpper[3,3], aux_alphaUpper[4,3], aux_alphaUpper[3,4], aux_alphaUpper[4,4]))
  }
  
  aux_alphaUpper2<-rbind(aux_alphaUpper2, aux2)
}

# Passing lambda to data frame
repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[1], split="_")[1])[6], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[1], split="_")[1])[6], split="[.]"))[1],split=""))[2]
  
Focal<-c("1","1","2","2","4","4","5","5")
Comp<-c("4","5","4","5","1","2","1","2")
Env<-rep(env, 8)
Rep<-rep(repli,8)
    
aux_lambda<-cbind(as.data.frame(lambda_list[[1]])[,c(3,4,5)],Focal,Comp, Env, Rep)

for(x in 2:length(lambda_list)){
  repli<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[x], split="_")[1])[6], split="[.]"))[1],split=""))[1]
  env<-unlist(strsplit(unlist(strsplit(unlist(strsplit(alpha_file[x], split="_")[1])[6], split="[.]"))[1],split=""))[2]
  
  if(x==3 | x==4){# because there is no SR2 here
    Focal<-c("1","1","4","5")
    Comp<-c("4","5","1","1")
    Env<-rep(env, 4)
    Rep<-rep(repli,4)
    
    aux<-cbind(as.data.frame(lambda_list[[x]])[,c(3,4,5)],Focal,Comp, Env, Rep)
    
  }else{
    Focal<-c("1","1","2","2","4","4","5","5")
    Comp<-c("4","5","4","5","1","2","1","2")
    Env<-rep(env, 8)
    Rep<-rep(repli,8)
    
    aux<-cbind(as.data.frame(lambda_list[[x]])[,c(3,4,5)],Focal,Comp, Env, Rep)
  }
  
  aux_lambda<-rbind(aux_lambda, aux)
}


#Matching all the data

alphas_mat_E<-as.data.frame(cbind(aux_alpha2, aux_alphaLower2, aux_alphaUpper2))

str(lambda_intra_fixed)
'data.frame':   36 obs. of  4 variables:
 $ Regime1  : num  1 1 2 2 1 1 2 2 1 1 ...
 $ Regime2  : num  4 5 4 5 4 5 4 5 4 5 ...
 $ Replicate: num  1 1 1 1 1 1 1 1 2 2 ...
 $ Env      : chr  "N" "N" "N" "N" ...
#### adding lambda

alphas_mat_E$lambdaTu<-sapply(c(1:length(alphas_mat_E[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_E$regimeTu[x] & Comp==alphas_mat_E$regimeTe[x]) & Rep==alphas_mat_E$Rep[x] & Env==alphas_mat_E$Env[x] )
  
  auxi[1,1]
})

alphas_mat_E$lambdaTe<-sapply(c(1:length(alphas_mat_E[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_E$regimeTe[x] & Comp==alphas_mat_E$regimeTu[x]) & Rep==alphas_mat_E$Rep[x] & Env==alphas_mat_E$Env[x] )
  
  auxi[1,1]
})


alphas_mat_E$lambdaTu_L<-sapply(c(1:length(alphas_mat_E[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_E$regimeTu[x] & Comp==alphas_mat_E$regimeTe[x]) & Rep==alphas_mat_E$Rep[x] & Env==alphas_mat_E$Env[x] )
  
  auxi[1,2]
})

alphas_mat_E$lambdaTe_L<-sapply(c(1:length(alphas_mat_E[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_E$regimeTe[x] & Comp==alphas_mat_E$regimeTu[x]) & Rep==alphas_mat_E$Rep[x] & Env==alphas_mat_E$Env[x] )
  
  auxi[1,2]
})

alphas_mat_E$lambdaTu_U<-sapply(c(1:length(alphas_mat_E[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_E$regimeTu[x] & Comp==alphas_mat_E$regimeTe[x]) & Rep==alphas_mat_E$Rep[x] & Env==alphas_mat_E$Env[x] )
  
  auxi[1,3]
})

alphas_mat_E$lambdaTe_U<-sapply(c(1:length(alphas_mat_E[,1])), function(x){
  auxi<-subset(aux_lambda, (Focal==alphas_mat_E$regimeTe[x] & Comp==alphas_mat_E$regimeTu[x]) & Rep==alphas_mat_E$Rep[x] & Env==alphas_mat_E$Env[x] )
  
  auxi[1,3]
})

alphas_mat_E$Env2<-mapvalues(alphas_mat_E$Env, c("C","N"), c("Cd","N"))

# clean up the matrix, because it has a lot of repeated columns
alphas_mat_E<-alphas_mat_E[,c(1:8, 13:16,21:30)]

alphas_mat_E
NA

Plotting data

### Plotting data

colnames(alphas_mat_E)<-c("Tu_Regime", "Te_Regime", "Environment", "Replicate", "Tu_intra", "Te_intra", "Tu_inter", "Te_inter", "Tu_intra_L", "Te_intra_L", "Tu_inter_L", "Te_inter_L", "Tu_intra_U", "Te_intra_U", "Tu_inter_U", "Te_inter_U", "Tu_lambda", "Te_lambda","Tu_lambda_L", "Te_lambda_L","Tu_lambda_U", "Te_lambda_U")


alphas_mat_E_long<-gather(alphas_mat_E, parameter, value,Tu_intra:Te_lambda_U )

alphas_mat_E_long$category<-mapvalues(alphas_mat_E_long$parameter, c("Tu_intra", "Te_intra", "Tu_inter", "Te_inter", "Tu_intra_L", "Te_intra_L", "Tu_inter_L", "Te_inter_L", "Tu_intra_U", "Te_intra_U", "Tu_inter_U", "Te_inter_U", "Tu_lambda", "Te_lambda","Tu_lambda_L", "Te_lambda_L","Tu_lambda_U", "Te_lambda_U"), c("intra", "intra", "inter", "inter", "intra_L", "intra_L", "inter_L", "inter_L","intra_U", "intra_U", "inter_U", "inter_U","lambda","lambda","lambda_L","lambda_L","lambda_U","lambda_U"))

str(alphas_mat_E_long)
'data.frame':   648 obs. of  7 variables:
 $ Tu_Regime  : chr  "1" "1" "2" "2" ...
 $ Te_Regime  : chr  "4" "5" "4" "5" ...
 $ Environment: chr  "C" "C" "C" "C" ...
 $ Replicate  : chr  "1" "1" "1" "1" ...
 $ parameter  : chr  "Tu_intra" "Tu_intra" "Tu_intra" "Tu_intra" ...
 $ value      : num  0.043 0.043 0.0684 0.0684 0.1217 ...
 $ category   : chr  "intra" "intra" "intra" "intra" ...
###########


ggplot(subset(alphas_mat_E_long, parameter=="Te_intra" & Tu_Regime=="1" & Environment=="C"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")

save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_intraTe_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(alphas_mat_E_long, parameter=="Te_intra" & Tu_Regime=="1" & Environment=="N"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. evansi)")+
  xlab("Environment")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_intraTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(alphas_mat_E_long, parameter=="Tu_intra" & Te_Regime=="4" & Environment=="C"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_intraTu_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(alphas_mat_E_long, parameter=="Tu_intra" & Te_Regime=="4" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intraspecific competition (T. urticae)")+
  xlab("Environment")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_intraTu_w0_rep_N.pdf", width=20, height=15)


######## INTER

ggplot(subset(alphas_mat_E_long, parameter=="Te_inter" & Environment=="C"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  facet_grid(.~Tu_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_x_discrete(labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Selection regime T. evansi")+
  ggtitle("Environment: cadmium")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_interTe_w0_rep_Cd.pdf", width=20, height=15)


ggplot(subset(alphas_mat_E_long, parameter=="Te_inter" & Environment=="N"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  facet_grid(.~Tu_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_x_discrete(labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. evansi)")+
  xlab("Selection regime T. evansi")+
  ggtitle("Environment: control")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_interTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(alphas_mat_E_long, parameter=="Tu_inter" & Environment=="C"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  facet_grid(.~Te_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75), aes(shape=Replicate))+
  theme_ines+
 scale_x_discrete(labels=c("Control", "Evolved"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Selection regime T. urticae")+
  ggtitle("Environment: cadmium")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_interTu_w0_rep_Cd.pdf", width=20, height=15)


ggplot(subset(alphas_mat_E_long, parameter=="Tu_inter" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  facet_grid(.~Te_Regime, labeller=labeller(Tu_Regime=regimeTu, Te_Regime=regimeTe))+
  geom_hline(yintercept = 0, colour="darkgray")+
  geom_boxplot(outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.75), aes(shape=Replicate))+
  theme_ines+
  scale_x_discrete(labels=c("Control", "Evolved"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Interspecific competition (T. urticae)")+
  xlab("Selection regime T. urticae")+
  ggtitle("Environment: control")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_interTu_w0_rep_N.pdf", width=20, height=15)


######### Lambda

ggplot(subset(alphas_mat_E_long, parameter=="Te_lambda" & Tu_Regime=="1" & Environment=="C"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. evansi)")+
  xlab("Selection regime T. evansi")+
  ggtitle("Environment: cadmium")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_lambdaTe_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(alphas_mat_E_long, parameter=="Te_lambda" & Tu_Regime=="1" & Environment=="N"), aes(x=Te_Regime, y=value, fill=Te_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point(position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  scale_colour_manual(c("#FFCC99", "#D55E30"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. evansi)")+
    xlab("Selection regime T. evansi")+
  ggtitle("Environment: control")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_lambdaTe_w0_rep_N.pdf", width=20, height=15)


ggplot(subset(alphas_mat_E_long, parameter=="Tu_lambda" & Te_Regime=="4" & Environment=="C"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Selection regime T. urticae")+
  ggtitle("Environment: cadmium")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_lambdaTu_w0_rep_CD.pdf", width=20, height=15)


ggplot(subset(alphas_mat_E_long, parameter=="Tu_lambda" & Te_Regime=="4" & Environment=="N"), aes(fill=Tu_Regime, y=value, x=Tu_Regime))+
  geom_boxplot( outlier.alpha = 0.01)+
  geom_point( position=position_dodge2(0.5), aes(shape=Replicate))+
  theme_ines+
  #scale_x_discrete(labels=c("No cadmium", "Cadmium"))+
  scale_fill_manual(values=c("#99FF99", "#009E73"),labels=c("Control", "Evolved"))+
  scale_colour_manual(values=c("#99FF99", "#009E73"), labels=c("Control", "Evolved"))+
  ylab("Intrinsic growth rate (T. urticae)")+
  xlab("Selection regime T. urticae")+
  ggtitle("Environment: control")
save_plot("./NewAnalyses/optim_lambda_fixed/26May_RK_lambdaTu_w0_rep_N.pdf", width=20, height=15)

NA
NA

Predicting data

str(alphas_mat_E)
'data.frame':   36 obs. of  22 variables:
 $ Tu_Regime  : chr  "1" "1" "2" "2" ...
 $ Te_Regime  : chr  "4" "5" "4" "5" ...
 $ Environment: chr  "C" "C" "C" "C" ...
 $ Replicate  : chr  "1" "1" "1" "1" ...
 $ Tu_intra   : num  0.043 0.043 0.0684 0.0684 0.1217 ...
 $ Te_intra   : num  0.103 0.16 0.103 0.16 0.165 ...
 $ Tu_inter   : num  0.0624 0.0501 0.0503 0.0564 0.0793 ...
 $ Te_inter   : num  0.0538 0.14 0.0847 0.1147 0.2086 ...
 $ Tu_intra_L : num  0.0132 0.0132 0.0362 0.0362 0.0847 ...
 $ Te_intra_L : num  0.0701 0.1099 0.0701 0.1099 0.1266 ...
 $ Tu_inter_L : num  0.0393 0.0255 0.0183 0.0228 0.0128 ...
 $ Te_inter_L : num  -0.0114 0.0928 0.029 0.0541 0.1285 ...
 $ Tu_intra_U : num  0.0728 0.0728 0.1006 0.1006 0.1587 ...
 $ Te_intra_U : num  0.136 0.21 0.136 0.21 0.204 ...
 $ Tu_inter_U : num  0.0856 0.0747 0.0823 0.09 0.1458 ...
 $ Te_inter_U : num  0.119 0.187 0.14 0.175 0.289 ...
 $ Tu_lambda  : num  1.6 1.6 1.89 1.89 3.9 ...
 $ Te_lambda  : num  3.3 5.17 3.3 5.17 11.11 ...
 $ Tu_lambda_L: num  -0.294 -0.294 -2.085 -2.085 -2.329 ...
 $ Te_lambda_L: num  -0.402 -7.439 -0.402 -7.439 1.895 ...
 $ Tu_lambda_U: num  3.49 3.49 5.86 5.86 10.13 ...
 $ Te_lambda_U: num  7 17.8 7 17.8 20.3 ...
alphas_mat_E$Env2<-mapvalues(alphas_mat_E$Environment, c("C", "N"), c("Cd","N"))
str(ca)
'data.frame':   3451 obs. of  45 variables:
 $ Block                       : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Rep                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Box                         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Leaf                        : int  3 4 3 4 3 4 3 4 3 4 ...
 $ Disk                        : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Env                         : chr  "N" "N" "Cd" "Cd" ...
 $ FocalSR                     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ CompSR                      : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Dens                        : int  1 1 1 1 2 2 2 2 4 4 ...
 $ Type                        : chr  "INTRA" "INTRA" "INTRA" "INTRA" ...
 $ Focalfemale                 : chr  "Te" "Te" "Te" "Te" ...
 $ FocalDead                   : int  0 0 1 0 1 1 0 0 0 0 ...
 $ FocalDrowned                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ FocalMissing                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumbDeadComp                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NumberOfEggs                : int  11 21 3 9 15 16 17 11 58 24 ...
 $ NumberOfEggsBelow           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ TeMales                     : int  3 3 0 3 2 5 5 3 8 8 ...
 $ TeFemales                   : int  6 9 2 5 2 10 4 4 9 6 ...
 $ TeQuiescentfemales          : int  0 0 0 0 0 0 3 0 3 4 ...
 $ TuMales                     : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuFemales                   : int  NA NA NA NA NA NA NA NA NA NA ...
 $ TuQuiescentfemales          : int  NA NA NA NA NA NA NA NA NA NA ...
 $ Observations                : chr  NA NA NA NA ...
 $ Block2                      : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ Rep2                        : Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Disk2                       : Factor w/ 16 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Leaf2                       : Factor w/ 2 levels "3","4": 1 2 1 2 1 2 1 2 1 2 ...
 $ Env2                        : Factor w/ 2 levels "Cd","N": 2 2 1 1 2 2 1 1 2 2 ...
 $ FocalSR2                    : Factor w/ 4 levels "1","2","4","5": 3 3 3 3 3 3 3 3 3 3 ...
 $ CompSR2                     : Factor w/ 4 levels "1","2","4","5": NA NA NA NA NA NA NA NA NA NA ...
 $ Type2                       : Factor w/ 2 levels "INTER","INTRA": 2 2 2 2 2 2 2 2 2 2 ...
 $ Focal_Female2               : Factor w/ 2 levels "Te","Tu": 1 1 1 1 1 1 1 1 1 1 ...
 $ Nr_Focal_Females_Tu_Alive_G0: num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_Te_Alive_G0: num  1 1 0 1 1 1 2 2 4 4 ...
 $ Num_Comp_Tu_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Num_Comp_Te_Alive_G0        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Nr_Focal_Females_G0         : num  1 1 1 1 2 2 2 2 4 4 ...
 $ Nr_Comp_Females_G0          : num  0 0 0 0 1 1 1 1 3 3 ...
 $ GrowthRateOA                : num  6 9 2 5 1 5 2 2 2.25 1.5 ...
 $ GrowthRateOA_Q              : num  6 9 2 5 1 5 3.5 2 3 2.5 ...
 $ Replicate                   : chr  "1" "1" "1" "1" ...
 $ pred_D                      : num  0.131 0.131 0.072 0.072 0.113 ...
 $ pred_D_L                    : num  7.34 7.34 1.68 1.68 6.54 ...
 $ pred_D_U                    : num  13.05 13.05 3.84 3.84 10.79 ...
# Since the lambda is from the log data
ca$pred_E<-sapply(c(1:length(ca$Block)), function(x){
  if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR[x]) & Replicate==ca$Rep[x])$Tu_intra[1]
    alpha_ij<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Te_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Tu_inter[1]
    lambda<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_lambda[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_intra[1]
    alpha_ij<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Tu_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Te_inter[1]
    lambda<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_lambda[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*densF)
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]
    pred<-lambda*exp(-alpha_ij*densC)
  }
    
  pred
  
})
x<-1
ca$pred_E_L<-sapply(c(1:length(ca$Block)), function(x){
  if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_intra_L[1]
    alpha_ij<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Te_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Tu_inter_L[1]
    lambda<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_lambda_L[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_intra_L[1]
    alpha_ij<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Tu_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Te_inter_L[1]
    lambda<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_lambda_L[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*densF)
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]-1
    pred<-lambda*exp(-alpha_ij*densC)
  }
    
  pred
  
})

ca$pred_E_U<-sapply(c(1:length(ca$Block)), function(x){
 if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_intra_U[1]
    alpha_ij<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Te_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Tu_inter_U[1]
    lambda<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Tu_lambda_U[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_intra_U[1]
    alpha_ij<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Tu_Regime==ca$CompSR[x] & Replicate==ca$Rep[x])$Te_inter_U[1]
    lambda<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR[x] & Replicate==ca$Rep[x])$Te_lambda_U[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*densF)
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]-1
    pred<-lambda*exp(-alpha_ij*densC)
  }
    
  pred
  
})

Predicting each density

density_aux<-seq(0, 10, by=(10/100))

pred_df_E<-as.data.frame(expand_grid(Density=density_aux, Tu_Regime=c(1,2), Te_Regime=c(4,5), Replicate=c(1:5), Environment=c("N", "C")))

pred_df_E$Tu_mean_intra<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_inter[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Tu_mean_inter<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_intra[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_inter[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_E$Density[x])
    
    pred
})


pred_df_E$Tu_intra_L<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_intra_L[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_inter_L[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_lambda_L[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Tu_inter_L<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_intra_L[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_inter_L[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_lambda_L[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Tu_intra_U<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_intra_U[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_inter_U[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_lambda_U[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Tu_inter_U<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_intra_U[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_inter_U[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Replicate==pred_df_E$Replicate[x])$Tu_lambda_U[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Te_mean_intra<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_inter[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Te_mean_inter<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_intra[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_inter[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_lambda[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Te_intra_L<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_intra_L[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_inter_L[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_lambda_L[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Te_inter_L<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_intra_L[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_inter_L[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_lambda_L[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Te_intra_U<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_intra_U[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_inter_U[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_lambda_U[1]
    
    pred<-lambda*exp(-alpha_i*pred_df_E$Density[x])
    
    pred
})

pred_df_E$Te_inter_U<-sapply(c(1:length(pred_df_E[,1])), function(x){
   alpha_i<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_intra_U[1]
    alpha_ij<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Tu_Regime==pred_df_E$Tu_Regime[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_inter_U[1]
    lambda<-subset(alphas_mat_E, Environment==pred_df_E$Environment[x] & Te_Regime==pred_df_E$Te_Regime[x] & Replicate==pred_df_E$Replicate[x])$Te_lambda_U[1]
    
    pred<-lambda*exp(-alpha_ij*pred_df_E$Density[x])
    
    pred
})

# Removing Tu evolved replicate 2 because there is no data
pred_df_E<-pred_df_E[-which(pred_df_E$Tu_Regime==2 & pred_df_E$Replicate==2),]



# Transforming everything bellow 0 into 0 for the lower interval

pred_df_E$Te_inter_L[which(pred_df_E$Te_inter_L<0)]<-0
pred_df_E$Te_intra_L[which(pred_df_E$Te_intra_L<0)]<-0
pred_df_E$Tu_inter_L[which(pred_df_E$Tu_inter_L<0)]<-0
pred_df_E$Tu_intra_L[which(pred_df_E$Tu_intra_L<0)]<-0

Plotting predictions

CONTROL INTRA
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==1 & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==1 & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific control environment")

ca$Replicate<-as.character(ca$Rep)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==1 & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==1 & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific control environment")
save_plot("./NewAnalyses/optim_lambda_fixed/pred_Tu_INTRA_Control_water.pdf", width=25, height=10)


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==1 & Environment=="C" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==1 & Environment=="C" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. urticae")+
  ggtitle("Tu control intraspecific cadmium environment")
save_plot("./NewAnalyses/optim_lambda_fixed/pred_Tu_INTRA_Control_cadmium.pdf", width=25, height=10)


#subset(pred_df_E, Tu_Regime==1 & Environment=="C" & Replicate==3)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Te_Regime==4 & Environment=="N" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==4 & Environment=="N" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific control environment")
save_plot("./NewAnalyses/optim_lambda_fixed/pred_Te_INTRA_Control_control.pdf", width=25, height=10)

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Te_Regime==4 & Environment=="C" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==4 & Environment=="C" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTRA"), aes(x=Dens-1, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
    ylab("Intraspecific competition T. evansi")+
  ggtitle("Te control intraspecific cadmium environment")
save_plot("./NewAnalyses/optim_lambda_fixed/pred_Te_INTRA_Control_cadmium.pdf", width=25, height=10)

CONTROL INTER vs control
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==1 & Environment=="N" & Te_Regime==4), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==1 & Environment=="N" & Te_Regime==4), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu & Te control interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==1 & Environment=="C" & Te_Regime==4), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==1 & Environment=="C" & Te_Regime==4), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu & Te control interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Te_Regime==4 & Environment=="N" & Tu_Regime==1), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==4 & Environment=="N" & Tu_Regime==1), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te  & Tu control intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_E, Te_Regime==4 & Environment=="C" & Tu_Regime==1), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==4 & Environment=="C" & Tu_Regime==1), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te & Tu control interspecific cadmium environment")

CONTROL INTER vs evolved
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==1 & Environment=="N" & Te_Regime==5), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==1 & Environment=="N" & Te_Regime==5), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="N" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu control & Te evolved interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==1 & Environment=="C" & Te_Regime==5), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==1 & Environment=="C" & Te_Regime==5), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==1 & Env=="Cd" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu control & Te evolved interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Te_Regime==4 & Environment=="N" & Tu_Regime==2), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==4 & Environment=="N" & Tu_Regime==2), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="N" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te control  & Tu evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_E, Te_Regime==4 & Environment=="C" & Tu_Regime==2), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==4 & Environment=="C" & Tu_Regime==2), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==4 & Env=="Cd" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te control  & Tu evolved interspecific cadmium environment")

CONTROL INTRA evolved
ca$Replicate<-as.character(ca$Rep)

ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==2 & Environment=="N" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==2 & Environment=="N" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved intraspecific control environment")


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==2 & Environment=="C" ), aes(x=Density, ymin=Tu_intra_L, ymax=Tu_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==2 & Environment=="C" ), aes(x=Density, y=Tu_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved intraspecific cadmium environment")


ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Te_Regime==5 & Environment=="N" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==5 & Environment=="N" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Te_Regime==5 & Environment=="C" ), aes(x=Density, ymin=Te_intra_L, ymax=Te_intra_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==5 & Environment=="C" ), aes(x=Density, y=Te_mean_intra), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTRA"), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved intraspecific cadmium environment")

Evolved INTER vs control
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==2 & Environment=="N" & Te_Regime==4), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==2 & Environment=="N" & Te_Regime==4), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te control interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==2 & Environment=="C" & Te_Regime==4), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==2 & Environment=="C" & Te_Regime==4), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTER" & CompSR==4), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te control interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Te_Regime==5 & Environment=="N" & Tu_Regime==1), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==5 & Environment=="N" & Tu_Regime==1), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu control intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_E, Te_Regime==5 & Environment=="C" & Tu_Regime==1), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==5 & Environment=="C" & Tu_Regime==1), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTER" & CompSR==1), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved & Tu control interspecific cadmium environment")

evolved INTER vs evolved
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==2 & Environment=="N" & Te_Regime==5), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==2 & Environment=="N" & Te_Regime==5), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="N" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te evolved interspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Tu_Regime==2 & Environment=="C" & Te_Regime==5), aes(x=Density, ymin=Tu_inter_L, ymax=Tu_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Tu_Regime==2 & Environment=="C" & Te_Regime==5), aes(x=Density, y=Tu_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==2 & Env=="Cd" & Type=="INTER" & CompSR==5), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Tu evolved & Te evolved interspecific cadmium environment")



ggplot()+
  facet_grid(.~Replicate)+
  geom_ribbon(data=subset(pred_df_E, Te_Regime==5 & Environment=="N" & Tu_Regime==2), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==5 & Environment=="N" & Tu_Regime==2), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="N" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu evolved intraspecific control environment")

  
ggplot()+
  facet_grid(.~Replicate)+
    geom_ribbon(data=subset(pred_df_E, Te_Regime==5 & Environment=="C" & Tu_Regime==2), aes(x=Density, ymin=Te_inter_L, ymax=Te_inter_U), alpha=0.85, colour="black", fill="lightgray", linetype="dashed")+
  geom_line(data=subset(pred_df_E, Te_Regime==5 & Environment=="C" & Tu_Regime==2), aes(x=Density, y=Te_mean_inter), colour="black")+
  geom_point(data=subset(ca, FocalSR==5 & Env=="Cd" & Type=="INTER" & CompSR==2), aes(x=Dens, y=GrowthRateOA))+
  theme_bw()+
  theme_ines+
  ggtitle("Te evolved  & Tu evolved interspecific cadmium environment")

4 - Testing similarities in estimation

Compare methods visually


# Putting names of selection regimes all the same
alphas_mat_D$Tu_Regime2<-alphas_mat_D$Tu_Regime
alphas_mat_D$Te_Regime2<-alphas_mat_D$Te_Regime


alphas_mat_D$Tu_Regime<-mapvalues(alphas_mat_D$Tu_Regime2, c("1","2","4","5"), c("SR1", "SR2", "SR4","SR5"))
The following `from` values were not present in `x`: 4, 5
alphas_mat_D$Te_Regime<-mapvalues(alphas_mat_D$Te_Regime2, c("1","2","4","5"), c("SR1", "SR2", "SR4","SR5"))
The following `from` values were not present in `x`: 1, 2
alphas_mat_E$Tu_Regime2<-alphas_mat_E$Tu_Regime
alphas_mat_E$Te_Regime2<-alphas_mat_E$Te_Regime


alphas_mat_E$Tu_Regime<-mapvalues(alphas_mat_E$Tu_Regime2, c("1","2","4","5"), c("SR1", "SR2", "SR4","SR5"))
The following `from` values were not present in `x`: 4, 5
alphas_mat_E$Te_Regime<-mapvalues(alphas_mat_E$Te_Regime2, c("1","2","4","5"), c("SR1", "SR2", "SR4","SR5"))
The following `from` values were not present in `x`: 1, 2
# doing the same with the environments

alphas_mat_D$Environment2<-alphas_mat_D$Environment

alphas_mat_D$Environment<-mapvalues(alphas_mat_D$Environment2, c("N","C"), c("N", "Cd"))

alphas_mat_E$Environment2<-alphas_mat_E$Environment

alphas_mat_E$Environment<-mapvalues(alphas_mat_E$Environment2, c("N","C"), c("N", "Cd"))


### Adding variable to say who estimated what

param_all_w0$Method<-"cxr"
param_all_B$Method<-"cxr lambda fixed"
param_all_C$Method<-"cxr lambda fixed, nested"
alphas_mat_D$Method<-"optim"
alphas_mat_E$Method<-"optim lambda fixed"

cols_to_join<-c("Tu_Regime", "Te_Regime", "Environment", "Replicate","Tu_lambda","Te_lambda", "Tu_intra","Te_intra", "Tu_inter", "Te_inter", "Method" )

comparison_methods<-rbind(param_all_w0[,cols_to_join],param_all_B[,cols_to_join],param_all_C[,cols_to_join], alphas_mat_D[,cols_to_join], alphas_mat_E[,cols_to_join] )

ggplot(comparison_methods, aes(x=Method, y=Tu_lambda, colour=Environment, fill=Environment, shape=Replicate))+
  facet_grid(Tu_Regime~Te_Regime)+
  geom_boxplot(aes(group=Method, fill=Environment), alpha=0.75, outlier.colour = NA)+
  geom_point(position = position_dodge2(0.5))+
  theme_ines+
  theme_bw()+
  xlab("Methods used to estimate data")+
  ylab("Tu lambda")+
  scale_x_discrete(labels=c("cxr", "cxr\nlambda","cxr\nnested", "optim", "optim\nlambda"))+
  scale_colour_manual(values=c("darkblue", "darkred"))


ggplot(comparison_methods, aes(x=Method, y=Te_lambda, colour=Environment, fill=Environment, shape=Replicate))+
  facet_grid(Tu_Regime~Te_Regime)+
  geom_boxplot(aes(group=Method, fill=Environment), alpha=0.75, outlier.colour = NA)+
  geom_point(position = position_dodge2(0.5))+
  theme_ines+
  theme_bw()+
  xlab("Methods used to estimate data")+
  ylab("Te lambda")+
  scale_x_discrete(labels=c("cxr", "cxr\nlambda","cxr\nnested", "optim", "optim\nlambda"))+
  scale_colour_manual(values=c("darkblue", "darkred"))



ggplot(comparison_methods, aes(x=Method, y=Tu_intra, colour=Environment, fill=Environment, shape=Replicate))+
  facet_grid(Tu_Regime~Te_Regime)+
  geom_boxplot(aes(group=Method, fill=Environment), alpha=0.75, outlier.colour = NA)+
  geom_point(position = position_dodge2(0.5))+
  theme_ines+
  theme_bw()+
  xlab("Methods used to estimate data")+
  ylab("Tu intra")+
  scale_x_discrete(labels=c("cxr", "cxr\nlambda","cxr\nnested", "optim", "optim\nlambda"))+
  scale_colour_manual(values=c("darkblue", "darkred"))


ggplot(comparison_methods, aes(x=Method, y=Te_intra, colour=Environment, fill=Environment, shape=Replicate))+
  facet_grid(Tu_Regime~Te_Regime)+
  geom_boxplot(aes(group=Method, fill=Environment), alpha=0.75, outlier.colour = NA)+
  geom_point(position = position_dodge2(0.5))+
  theme_ines+
  theme_bw()+
  xlab("Methods used to estimate data")+
  ylab("Te intra")+
  scale_x_discrete(labels=c("cxr", "cxr\nlambda","cxr\nnested", "optim", "optim\nlambda"))+
  scale_colour_manual(values=c("darkblue", "darkred"))

  
ggplot(comparison_methods, aes(x=Method, y=Tu_inter, colour=Environment, fill=Environment, shape=Replicate))+
  facet_grid(Tu_Regime~Te_Regime)+
  geom_boxplot(aes(group=Method, fill=Environment), alpha=0.75, outlier.colour = NA)+
  geom_point(position = position_dodge2(0.5))+
  theme_ines+
  theme_bw()+
  xlab("Methods used to estimate data")+
  ylab("Tu inter")+
  scale_x_discrete(labels=c("cxr", "cxr\nlambda","cxr\nnested", "optim", "optim\nlambda"))+
  scale_colour_manual(values=c("darkblue", "darkred"))


ggplot(comparison_methods, aes(x=Method, y=Te_inter, colour=Environment, fill=Environment, shape=Replicate))+
  facet_grid(Tu_Regime~Te_Regime)+
  geom_boxplot(aes(group=Method, fill=Environment), alpha=0.75, outlier.colour = NA)+
  geom_point(position = position_dodge2(0.5))+
  theme_ines+
  theme_bw()+
  xlab("Methods used to estimate data")+
  ylab("Te inter")+
  scale_x_discrete(labels=c("cxr", "cxr\nlambda","cxr\nnested", "optim", "optim\nlambda"))+
  scale_colour_manual(values=c("darkblue", "darkred"))

Estimate distance between predicted and observed

Since I can’t really know what is the best approach, I will estimate the predicted vs observed for each method and use that as metric to define which method to use in the results

Predict values

ca$FocalSR3<-mapvalues(ca$FocalSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))

ca$CompSR3<-mapvalues(ca$CompSR, c(1,2,4,5), c("SR1", "SR2","SR4","SR5"))

ca$Env3<-mapvalues(ca$Env, c("N", "Cd"), c("N", "C"))

# Since the lambda is from the log data
ca$pred_A<-sapply(c(1:length(ca$Block)), function(x){
  if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(param_all_w0, Environment==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_w0, Environment==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Te_Regime==as.character(ca$CompSR3[x]) & Replicate==ca$Rep[x])$Tu_inter[1]
    lambda<-subset(param_all_w0, Environment==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Tu_lambda[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(param_all_w0, Environment==as.character(ca$Env[x]) & Te_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Te_intra[1]
    alpha_ij<-subset(param_all_w0, Environment==as.character(ca$Env[x]) & Te_Regime==as.character(ca$FocalSR3[x]) & Tu_Regime==as.character(ca$CompSR3[x]) & Replicate==ca$Rep[x])$Te_inter[1]
    lambda<-subset(param_all_w0, Environment==as.character(ca$Env[x]) & Te_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Te_lambda[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*(densF))
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]-1
    densF<-1
    pred<-lambda*exp(-alpha_i*(densF)-alpha_ij*densC)
  }
    
  pred
  
})


ca$pred_B<-sapply(c(1:length(ca$Block)), function(x){
  if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(param_all_B, Environment==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_B, Environment==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Te_Regime==as.character(ca$CompSR3[x]) & Replicate==ca$Rep[x])$Tu_inter[1]
    lambda<-subset(param_all_B, Environment==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Tu_lambda[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(param_all_B, Environment==as.character(ca$Env[x]) & Te_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Te_intra[1]
    alpha_ij<-subset(param_all_B, Environment==as.character(ca$Env[x]) & Te_Regime==as.character(ca$FocalSR3[x]) & Tu_Regime==as.character(ca$CompSR3[x]) & Replicate==ca$Rep[x])$Te_inter[1]
    lambda<-subset(param_all_B, Environment==as.character(ca$Env[x]) & Te_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Te_lambda[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*(densF))
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]-1
    densF<-1
    pred<-lambda*exp(-alpha_i*(densF)-alpha_ij*densC)
  }
    
  pred
  
})

ca$pred_C<-sapply(c(1:length(ca$Block)), function(x){
  if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(param_all_C, Environment==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Tu_intra[1]
    alpha_ij<-subset(param_all_C, Environment==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Te_Regime==as.character(ca$CompSR3[x]) & Replicate==ca$Rep[x])$Tu_inter[1]
    lambda<-subset(param_all_C, Environment==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Tu_lambda[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(param_all_C, Environment==as.character(ca$Env[x]) & Te_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Te_intra[1]
    alpha_ij<-subset(param_all_C, Environment==as.character(ca$Env[x]) & Te_Regime==as.character(ca$FocalSR3[x]) & Tu_Regime==as.character(ca$CompSR3[x]) & Replicate==ca$Rep[x])$Te_inter[1]
    lambda<-subset(param_all_C, Environment==as.character(ca$Env[x]) & Te_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Te_lambda[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*(densF))
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]-1
    densF<-1
    pred<-lambda*exp(-alpha_i*(densF)-alpha_ij*densC)
  }
    
  pred
  
})

ca$pred_D<-sapply(c(1:length(ca$Block)), function(x){
  if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Tu_intra[1]
    alpha_ij<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR3[x] & Te_Regime==ca$CompSR3[x] & Replicate==ca$Rep[x])$Tu_inter[1]
    lambda<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR3[x] & Replicate==ca$Rep[x])$Tu_lambda[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR3[x] & Replicate==ca$Rep[x])$Te_intra[1]
    alpha_ij<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR3[x] & Tu_Regime==ca$CompSR3[x] & Replicate==ca$Rep[x])$Te_inter[1]
    lambda<-subset(alphas_mat_D, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR3[x] & Replicate==ca$Rep[x])$Te_lambda[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*(densF))
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]-1
    densF<-1
    pred<-lambda*exp(-alpha_i*(densF)-alpha_ij*densC)
  }
    
  pred
  
})

ca$pred_E<-sapply(c(1:length(ca$Block)), function(x){
  if(ca$Focalfemale[x]=="Tu"){
    alpha_i<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==as.character(ca$FocalSR3[x]) & Replicate==ca$Rep[x])$Tu_intra[1]
    alpha_ij<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR3[x] & Te_Regime==ca$CompSR3[x] & Replicate==ca$Rep[x])$Tu_inter[1]
    lambda<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Tu_Regime==ca$FocalSR3[x] & Replicate==ca$Rep[x])$Tu_lambda[1]
    
  }else if(ca$Focalfemale[x]=="Te"){
    alpha_i<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR3[x] & Replicate==ca$Rep[x])$Te_intra[1]
    alpha_ij<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR3[x] & Tu_Regime==ca$CompSR3[x] & Replicate==ca$Rep[x])$Te_inter[1]
    lambda<-subset(alphas_mat_E, Env2==as.character(ca$Env[x]) & Te_Regime==ca$FocalSR3[x] & Replicate==ca$Rep[x])$Te_lambda[1]
  }
  
  if(ca$Type[x]=="INTRA"){
    densF<-ca$Dens[x]
    pred<-lambda*exp(-alpha_i*densF)
    
  }else if(ca$Type[x]=="INTER"){
    densC<-ca$Dens[x]-1
    densF<-1
    pred<-lambda*exp(-alpha_i*(densF)-alpha_ij*densC)
  }
    
  pred
  
})

Calculate distances

Do not forget that this is the log of GR +1

euclidean <- function(a, b) sqrt(sum((a - b)^2))


ca$distA<-sapply(c(1:length(ca$Block)), function(x){
  euc<-euclidean(ca$pred_A[x], ca$GrowthRateOA[x])

  euc
})

ca$distB<-sapply(c(1:length(ca$Block)), function(x){
  euc<-euclidean(ca$pred_B[x], ca$GrowthRateOA[x])

  euc
})

ca$distC<-sapply(c(1:length(ca$Block)), function(x){
  euc<-euclidean(ca$pred_C[x], ca$GrowthRateOA[x])

  euc
})

ca$distD<-sapply(c(1:length(ca$Block)), function(x){
  euc<-euclidean(ca$pred_D[x], ca$GrowthRateOA[x])

  euc
})

ca$distE<-sapply(c(1:length(ca$Block)), function(x){
  euc<-euclidean(ca$pred_E[x], ca$GrowthRateOA[x])

  euc
})

hist(ca$distA)

hist(ca$distB)

hist(ca$distC)

hist(ca$distD)

hist(ca$distE)


sum(ca$distA, na.rm = TRUE)
[1] 6491.704
sum(ca$distB, na.rm = TRUE)
[1] 6700.173
sum(ca$distC, na.rm = TRUE)
[1] 6571.096
sum(ca$distD, na.rm = TRUE)
[1] 7849.336
sum(ca$distE, na.rm = TRUE)
[1] 6442.68

The smaller sum of euclidean distance is with cxr package, but the lambda estimation does not seem to reflect the real estimates we obtain, so we will use the cxr nested fixed, which is the second best

Plotting distance

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBQYWNrYWdlcyBhbmQgZnVuY3Rpb25zCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGNhcikKbGlicmFyeShmaXRkaXN0cnBsdXMpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdndGV4dCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkoZ2xtbVRNQikKbGlicmFyeShnZ2JyZWFrKQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkoY3hyKQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkobXZ0bm9ybSkKbGlicmFyeShEZXNjVG9vbHMpCmxpYnJhcnkocGhpYSkKbGlicmFyeShwZXJmb3JtYW5jZSkKbGlicmFyeShESEFSTWEpCmxpYnJhcnkoZWZmZWN0cykKbGlicmFyeShjb3dwbG90KQoKdGhlbWVfaW5lczwtdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTQpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIGZhY2U9ImJvbGQiKSwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiksIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCwgZmFjZT0iYm9sZCIpLCBwYW5lbC5ncmlkPWVsZW1lbnRfbGluZShjb2xvdXI9IndoaXRlIiksIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiKSAsIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiksIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiKSkKCnNhdmVfcGxvdDwtZnVuY3Rpb24oZGlyLCB3aWR0aD0xNSwgaGVpZ2h0PTEwLCAuLi4pewogIGdnc2F2ZShkaXIsIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodCwgdW5pdHMgPSBjKCJjbSIpKQp9CgpFbnY8LWMoIldhdGVyIiwgIkNhZG1pdW0iKQpuYW1lcyhFbnYpPC1jKCJOIiwgIkNkIikKYGBgCgoKIyAxIC0gSW1wb3J0aW5nIGRhdGEgYW5kIGNoZWNraW5nIGl0CgpgYGB7cn0KY29leDwtcmVhZC5jc3YoIkRhdGFfY2FkbWl1bS9EYXRhX2Zvcl9SL0NvZXhpc3RlbmNlIENkX0c0Ml9jaGVja2VkLmNzdiIsIGhlYWRlcj1UUlVFKSAjIERhdGEgZnJvbSB0aGUgY29leGlzdGVuY2UgZXhwZXJpbWVudApjYV9yYXc8LXJlYWQuY3N2KGZpbGUgPSAiRGF0YV9jYWRtaXVtL0RhdGFfZm9yX1IvQ29tcGV0aXRpdmVBYmlsaXR5IENkX0c0MF9jb21wbGV0ZS5jc3YiLCBoZWFkZXI9VFJVRSkgIyBjZGF0YSBmcm9tIHRoZSBjb21wZXRpdGl2ZSBhYmlsaXR5CgpzdHIoY2FfcmF3KSAKIyBTdW1tYXJ5IG9mIHRoZSBkYXRhIHRvIGJlIHN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIG9rIQpzdW1tYXJ5KGFzLmZhY3RvcihjYV9yYXckRm9jYV9yYXdsU1IpKQoKY2FfcmF3JEJsb2NrMjwtYXMuZmFjdG9yKGNhX3JhdyRCbG9jaykKY2FfcmF3JFJlcDI8LWFzLmZhY3RvcihjYV9yYXckUmVwKQpjYV9yYXckRGlzazI8LWFzLmZhY3RvcihjYV9yYXckRGlzaykKY2FfcmF3JExlYWYyPC1hcy5mYWN0b3IoY2FfcmF3JExlYWYpCmNhX3JhdyRFbnYyPC1hcy5mYWN0b3IoY2FfcmF3JEVudikKY2FfcmF3JEZvY2FsU1IyPC1hcy5mYWN0b3IoY2FfcmF3JEZvY2FsU1IpCmNhX3JhdyRDb21wU1IyPC1hcy5mYWN0b3IoY2FfcmF3JENvbXBTUikKY2FfcmF3JFR5cGUyPC1hcy5mYWN0b3IoY2FfcmF3JFR5cGUpCmNhX3JhdyRGb2NhbF9GZW1hbGUyPC1hcy5mYWN0b3IoY2FfcmF3JEZvY2FsZmVtYWxlKQoKCnJlZ2ltZVR1PC1jKCJUdSBcbmNvbnRyb2wiLCAiVHUgZXZvbHZlZCBcbiBpbiBjYWRtaXVtIikKbmFtZXMocmVnaW1lVHUpPC1jKCJTUjEiLCAiU1IyIikKCnJlZ2ltZVRlPC1jKCJUZSBcbiBjb250cm9sIiwgIlRlIGV2b2x2ZWQgXG4gaW4gY2FkbWl1bSIpCm5hbWVzKHJlZ2ltZVRlKTwtYygiU1I0IiwgIlNSNSIpCgojQ3JlYXRpbmcgY29sdW1ucyB0aGF0IGFyZSBuZWVkZWQKY2FfcmF3JE5yX0ZvY2FsX0ZlbWFsZXNfVHVfQWxpdmVfRzA8LXNhcHBseShjKDE6bGVuZ3RoKGNhX3JhdyRCbG9jaykpLCBmdW5jdGlvbih4KXsKICBpZihjYV9yYXckRm9jYWxmZW1hbGVbeF09PSJUdSIpewogICAgaWYoY2FfcmF3JFR5cGVbeF09PSJJTlRSQSIpewogICAgICBhPC1jYV9yYXckRGVuc1t4XS1jYV9yYXckRm9jYWxEZWFkW3hdLWNhX3JhdyRGb2NhbERyb3duZWRbeF0tY2FfcmF3JEZvY2FsTWlzc2luZ1t4XQogICAgfWVsc2UKICAgICAgYTwtMS1jYV9yYXckRm9jYWxEZWFkW3hdLWNhX3JhdyRGb2NhbERyb3duZWRbeF0tY2FfcmF3JEZvY2FsTWlzc2luZ1t4XQogICAgCiAgfWVsc2UKICAgIGE8LU5BCn0pCgpjYV9yYXckTnJfRm9jYWxfRmVtYWxlc19UZV9BbGl2ZV9HMDwtc2FwcGx5KGMoMTpsZW5ndGgoY2FfcmF3JEJsb2NrKSksIGZ1bmN0aW9uKHgpewogIGlmKGNhX3JhdyRGb2NhbGZlbWFsZVt4XT09IlRlIil7CiAgICBpZihjYV9yYXckVHlwZVt4XT09IklOVFJBIil7CiAgICAgIGE8LWNhX3JhdyREZW5zW3hdLWNhX3JhdyRGb2NhbERlYWRbeF0tY2FfcmF3JEZvY2FsRHJvd25lZFt4XS1jYV9yYXckRm9jYWxNaXNzaW5nW3hdCiAgICB9ZWxzZQogICAgICBhPC0xLWNhX3JhdyRGb2NhbERlYWRbeF0tY2FfcmF3JEZvY2FsRHJvd25lZFt4XS1jYV9yYXckRm9jYWxNaXNzaW5nW3hdCiAgICAKICB9ZWxzZQogICAgYTwtTkEKfSkKCgpjYV9yYXckTnVtX0NvbXBfVHVfQWxpdmVfRzA8LXNhcHBseShjKDE6bGVuZ3RoKGNhX3JhdyRCbG9jaykpLCBmdW5jdGlvbih4KXsKICBpZihjYV9yYXckRm9jYWxmZW1hbGVbeF09PSJUZSIpewogICAgaWYoY2FfcmF3JFR5cGVbeF09PSJJTlRFUiIpewogICAgICBhPC1jYV9yYXckRGVuc1t4XS1jYV9yYXckTnVtYkRlYWRDb21wW3hdLTEKICAgIH1lbHNlCiAgICAgIGE8LU5BCiAgICAKICB9ZWxzZQogICAgYTwtTkEKfSkKCgpjYV9yYXckTnVtX0NvbXBfVGVfQWxpdmVfRzA8LXNhcHBseShjKDE6bGVuZ3RoKGNhX3JhdyRCbG9jaykpLCBmdW5jdGlvbih4KXsKICBpZihjYV9yYXckRm9jYWxmZW1hbGVbeF09PSJUdSIpewogICAgaWYoY2FfcmF3JFR5cGVbeF09PSJJTlRFUiIpewogICAgICBhPC1jYV9yYXckRGVuc1t4XS1jYV9yYXckTnVtYkRlYWRDb21wW3hdLTEKICAgIH1lbHNlCiAgICAgIGE8LU5BCiAgICAKICB9ZWxzZQogICAgYTwtTkEKfSkKCmNhX3JhdyROcl9Gb2NhbF9GZW1hbGVzX0cwPC1zYXBwbHkoYygxOmxlbmd0aChjYV9yYXckQmxvY2spKSwgZnVuY3Rpb24oeCl7CiAgICBpZihjYV9yYXckVHlwZVt4XT09IklOVFJBIil7CiAgICAgIGE8LWNhX3JhdyREZW5zW3hdCiAgICB9ZWxzZQogICAgICBhPC0xCgp9KQoKY2FfcmF3JE5yX0NvbXBfRmVtYWxlc19HMDwtc2FwcGx5KGMoMTpsZW5ndGgoY2FfcmF3JEJsb2NrKSksIGZ1bmN0aW9uKHgpewogICAgICBhPC1jYV9yYXckRGVuc1t4XS0xCgogICAgICBhCgp9KQoKIyBSZW1vdmluZyByb3dzIHdoZXJlIHRoZXJlIHdlcmUgbGVzcyB0aGFuIDAgZmVtYWxlcwpjYV9yYXc8LWNhX3Jhd1stYyh3aGljaChjYV9yYXckTnVtX0NvbXBfVGVfQWxpdmVfRzA8MCksd2hpY2goY2FfcmF3JE51bV9Db21wX1R1X0FsaXZlX0cwPDApLCB3aGljaChjYV9yYXckTnJfRm9jYWxfRmVtYWxlc19UZV9BbGl2ZV9HMDwwKSx3aGljaChjYV9yYXckTnJfRm9jYWxfRmVtYWxlc19UdV9BbGl2ZV9HMDwwKSApLF0KCgojIFJlbW92aW5nIHZpcmdpbiBmZW1hbGVzCmNhX3Jhd192aXJnaW48LWNhX3Jhd1tjKHdoaWNoKGNhX3JhdyRUZUZlbWFsZXM9PTAgJmNhX3JhdyRUZU1hbGVzPjAgJiBjYV9yYXckRm9jYWxmZW1hbGU9PSJUZSIgKSx3aGljaChjYV9yYXckVHVGZW1hbGVzPT0wICZjYV9yYXckVHVNYWxlcz4wICYgY2FfcmF3JEZvY2FsZmVtYWxlPT0iVHUiICkpLF0KCmNhPC1jYV9yYXdbLWMod2hpY2goY2FfcmF3JFRlRmVtYWxlcz09MCAmY2FfcmF3JFRlTWFsZXM+MCAmIGNhX3JhdyRGb2NhbGZlbWFsZT09IlRlIiApLHdoaWNoKGNhX3JhdyRUdUZlbWFsZXM9PTAgJmNhX3JhdyRUdU1hbGVzPjAgJiBjYV9yYXckRm9jYWxmZW1hbGU9PSJUdSIgKSksXQoKYGBgCgojIDIgLSBFc3RpbWF0ZSBncm93dGggcmF0ZSBwZXIgZ2VuZXJhdGlvbgoKYGBge3J9CgpjYVssYygiTnJfRm9jYWxfRmVtYWxlc19HMCIsICJEZW5zIiwgIlR5cGUiKV0KCgpjYSRHcm93dGhSYXRlT0E8LXNhcHBseShjKDE6bGVuZ3RoKGNhWywxXSkpLCBmdW5jdGlvbih4KXsKICAjcHJpbnQoeCkKICBpZihjYSRGb2NhbF9GZW1hbGVbeF09PSJUdSIpewogICAgYTwtY2EkVHVGZW1hbGVzW3hdL2NhJE5yX0ZvY2FsX0ZlbWFsZXNfRzBbeF0KICB9ZWxzZSBpZihjYSRGb2NhbF9GZW1hbGVbeF09PSJUZSIpewogICAgYTwtY2EkVGVGZW1hbGVzW3hdL2NhJE5yX0ZvY2FsX0ZlbWFsZXNfRzBbeF0KICB9ZWxzZQogICAgYTwtTkEKICAKICBhCn0pCgpjYSRHcm93dGhSYXRlT0FfUTwtc2FwcGx5KGMoMTpsZW5ndGgoY2FbLDFdKSksIGZ1bmN0aW9uKHgpewogICNwcmludCh4KQogIGlmKGNhJEZvY2FsX0ZlbWFsZVt4XT09IlR1Iil7CiAgICBhPC0oY2EkVHVGZW1hbGVzW3hdK2NhJFR1UXVpZXNjZW50ZmVtYWxlc1t4XSkvY2EkTnJfRm9jYWxfRmVtYWxlc19HMFt4XQogIH1lbHNlIGlmKGNhJEZvY2FsX0ZlbWFsZVt4XT09IlRlIil7CiAgICBhPC0oY2EkVGVGZW1hbGVzW3hdK2NhJFRlUXVpZXNjZW50ZmVtYWxlc1t4XSkvY2EkTnJfRm9jYWxfRmVtYWxlc19HMFt4XQogIH1lbHNlCiAgICBhPC1OQQogIAogIGEKfSkKCmBgYAoKIyAzIC0gRXN0aW1hdGUgY29tcGV0aXRpdmUgYWJpbGl0eSAmIHByZWRpY3QgZGF0YQoKSGVyZSB3ZSBoYXZlIHR3byBkaWZmZXJlbnkgbWV0aG9kcywgdXNpbmcgdGhlIGN4ciBwYWNrYWdlIG9yIHdpdGggdGhlIG9wdGltLiBXZSB3aWxsIGFsc28gdmFyeSBpZiB3ZSBlc3RpbWF0ZSBsYW1iZGEgZnJvbSB0aGUgZGF0YSBvciBmcm9tIHRoZSBtb2RlbCBhbmQgaWYgdXNpbmcgY3hyIHdpdGggdGhlIG5lc3RlZCBhcHByb2FjaCBpcyBiZXR0ZXIgb3Igbm90LiBTbyB0aGUgZGlmZmVyZW50IGh5cG90aGVzaXMgYXJlCgpBIC0gQ1hSIG5vcm1hbDogdXNpbmcgY3hyIHdpdGggdGhlIG5vcm1hbCBhcHByb2FjaApCIC0gQ1hSIGxhbWJkYSBmaXhlZDogdXNpbmcgY3hyIGJ1dCBsYW1iZGEgY29tZXMgZnJvbSB0aGUgZGF0YQpDIC0gQ1hSIG5lc3RlZDogbGFtYmRhIGNvbWVzIHRoZSBkYXRhLCBhbmQgd2UgdXNlIHRoZSBzYW1lIG5lc3RlZCBhcHByb2FjaCBhcyB0aGUgb3B0aW0gLS0+IGZvciB0aGF0IHdlIGNhbiBwdXQgaW50cmEgYXMgYW5vdGhlciBzcGVjaWVzIChjb2x1bW4pCkQgLSBvcHRpbSBub3JtYWw6IHRoZSBzYW1lIGFwcHJvYWNoIGFzIHVzZWQgaW4gRnJhZ2F0YSAyMDIyCkUgLSBvcHRpbSBsYW1iZGEgZml4ZWQ6IHVzaW5nIG9wdGltLCBidXQgbGFtYmRhIGlzIGZpeGVkIAoKSW4gYWxsIHRoZSBtb2RlbHMgd2Ugd2lsbCB1c2UgZGVuc2l0eSAtMSBmb3IgdGhlIGludHJhLCB3aGljaCBiYXNpY2FsbHkgY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBjb21wZXRpdG9ycy4KCgojIyMgQSAtIENYUiBub3JtYWwKCmN4ciBhY2NlcHRzIGEgZGF0YSBmcmFtZSB3aXRoIGEgZmlyc3QgY29sdW1uIGNhbGxlZCBmaXRuZXNzIHdpdGggcG9zaXRpdmUgdmFsdWVzIGFuZCBudW1lcmljIGNvbHVtbnMgd2l0aCBudW1iZXIgb2YgaW5kaXZpZHVhbHMuIEVhY2ggcm93IGlzIG9uZSBpbmRpdmlkdWFsLiBGb3IgbXVsdGlwbGUgc3BlY2llcyB0aGUgZWFzaWVyIGlzIHRvIGNyZWF0ZSBhIGxpc3QsIGVhY2ggd2l0aCBhIGRhdGEgZnJhbWUgdGhhdCBoYXMgaW4gdGhlIGZpcnN0IGNvbHVtbiBudW1iZXIgb2YgaW5kaXZpZHVhbHMgcHJvZHVjZWQgYW5kIHRoZW4gdGhlIG51bWJlciBvZiBuZWlnaGJvdXJzCgp0aGlzIGNhc2Ugd2UgdHJhbnNmb3JtZWQgYWxsIDBzIGludG8gMSAoc28gdGhhdCB0aGUgbG9nIGlzIDApIEZvciB0aGF0IHdlIG5lZWQgdG8gYWRkICsxIHRvIGFsbCBkYXRhIHNvIHRoYXQgdGhlIHZhcmlhbmNlIGlzIG5vdCBjaGFuZ2VkCgojIyMjIyBub3JtYWwKCmBgYHtyfQpkaXIuY3JlYXRlKCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwiLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKCiMgbW9kaWZ5aW5nIGRhdGEgZnJhbWUgdG8gZml0IHRoZSB0eXBlIG9mIHNldHVwIHRoYXQgaXMgbmVlZCBmb3IgQ1hSCmZvckNYUl9OPC1zdWJzZXQoY2EsIEVudj09Ik4iKVssYygiUmVwIiwgIkZvY2FsU1IiLCAiQ29tcFNSIiwgIkRlbnMiLCAiVGVGZW1hbGVzIiwgIlR1RmVtYWxlcyIpXQoKZm9yQ1hSX04kRm9jYWw8LW1hcHZhbHVlcyhmb3JDWFJfTiRGb2NhbFNSLCBjKDEsMiw0LDUpLCBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikpCmZvckNYUl9OJENvbXBTUjI8LW1hcHZhbHVlcyhmb3JDWFJfTiRDb21wU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCJTUjUiKSkKCmZvckNYUl9OJENvbXA8LXNhcHBseShjKDE6bGVuZ3RoKGZvckNYUl9OWywxXSkpLCBmdW5jdGlvbih4KXsKICBpZihpcy5uYShmb3JDWFJfTiRDb21wU1IyW3hdKSl7CiAgICBhPC0gZm9yQ1hSX04kRm9jYWxbeF0KICB9ZWxzZXsKICAgIGE8LWZvckNYUl9OJENvbXBTUjJbeF0KICB9CiAgCiAgYQp9KQoKYXV4PC1kYXRhLmZyYW1lKFNSMT1yZXAoMCwgbGVuZ3RoKGZvckNYUl9OWywxXSkpLCBTUjI9cmVwKDAsIGxlbmd0aChmb3JDWFJfTlssMV0pKSwgU1I0PXJlcCgwLCBsZW5ndGgoZm9yQ1hSX05bLDFdKSksIFNSNT1yZXAoMCwgbGVuZ3RoKGZvckNYUl9OWywxXSkpKQoKZm9yKGkgaW4gMTpsZW5ndGgoZm9yQ1hSX05bLDFdKSl7CiAgI2NvbHVuYSBvbmRlIHBvciBmb2NhaXMKICBjb2x1bmFGPC13aGljaChjb2xuYW1lcyhhdXgpPT1mb3JDWFJfTiRGb2NhbFtpXSkKICAjY29sdW5hIG9uZGUgcG9yIGNvbXBldGlkb3JzCiAgY29sdW5hQzwtd2hpY2goY29sbmFtZXMoYXV4KT09Zm9yQ1hSX04kQ29tcFtpXSkKICAKICAjaWYgaXRzIHRoZSBzYW1lIHJlZ2ltZQogIGlmKGZvckNYUl9OJEZvY2FsW2ldPT1mb3JDWFJfTiRDb21wW2ldICYgZm9yQ1hSX04kRGVuc1tpXT09MSl7CiAgICBhdXhbaSxjb2x1bmFGXTwtZm9yQ1hSX04kRGVuc1tpXS0xCiAgICAKICB9ZWxzZSBpZihmb3JDWFJfTiRGb2NhbFtpXT09Zm9yQ1hSX04kQ29tcFtpXSl7CiAgICBhdXhbaSxjb2x1bmFGXTwtZm9yQ1hSX04kRGVuc1tpXS0xCiAgfWVsc2V7ICNpZiBpdCBpcyBoZXRlcm9zcGVjaWZpYyB0aGVuIGl0cyAtMSBmb3IgdGhlIGNvbXBldGl0b3JzIChiZWNhdXNlIG9mIHRoZSBmb2NhbCkgYW5kIGl0cyBvbmUgZm9yIHRoZSBmb2NhbAogICAgYXV4W2ksY29sdW5hQ108LWZvckNYUl9OJERlbnNbaV0tMQogICAgYXV4W2ksIGNvbHVuYUZdPC0xCiAgfQogIAp9Cgpmb3JDWFJfTjwtY2JpbmQoZm9yQ1hSX04sIGF1eCkKCmZvckNYUl9OJGZpdG5lc3M8LXNhcHBseShjKDE6bGVuZ3RoKGZvckNYUl9OWywxXSkpLCBmdW5jdGlvbih4KXsKICBjb2xGPC13aGljaChjb2xuYW1lcyhmb3JDWFJfTik9PWZvckNYUl9OJEZvY2FsW3hdKQogIAogIGlmKGZvckNYUl9OJEZvY2FsW3hdPT0iU1IxIil7CiAgICBhPC1mb3JDWFJfTiRUdUZlbWFsZXNbeF0vZm9yQ1hSX04kU1IxW3hdCiAgfSBlbHNlIGlmKGZvckNYUl9OJEZvY2FsW3hdPT0iU1IyIil7CiAgICBhPC1mb3JDWFJfTiRUdUZlbWFsZXNbeF0vZm9yQ1hSX04kU1IyW3hdCiAgfSBlbHNlIGlmKGZvckNYUl9OJEZvY2FsW3hdPT0iU1I0Iil7CiAgICBhPC1mb3JDWFJfTiRUZUZlbWFsZXNbeF0vZm9yQ1hSX04kU1I0W3hdCiAgfSBlbHNlIGlmKGZvckNYUl9OJEZvY2FsW3hdPT0iU1I1Iil7CiAgICBhPC1mb3JDWFJfTiRUZUZlbWFsZXNbeF0vZm9yQ1hSX04kU1I1W3hdCiAgfQogIAogIGEKfSkKCiNyZW1vdmluZyByb3dzIGZvciB3aGljaCB0aGVyZSBpcyBubyBkYXRhIGZvciBmaXRuZXNzCmZvckNYUl9OPC1mb3JDWFJfTlstd2hpY2goaXMubmEoZm9yQ1hSX04kZml0bmVzcykpLF0KCiMgYWRkaW5nICsxIHRvIGFsbCBkYXRhCiNmb3JDWFJfTiRmaXRuZXNzPC1mb3JDWFJfTiRmaXRuZXNzKzEKCmZvckNYUl9OW3doaWNoKGZvckNYUl9OJGZpdG5lc3M9PSItSW5mIiB8IGZvckNYUl9OJGZpdG5lc3M9PSJJbmYiKSwiZml0bmVzcyJdPC0wCgoKIyBhbGwgZGF0YSBnZXRzICsxIGJlY2F1c2Ugb2YgdGhlIDAgcHJvYmxlbQpmb3JDWFJfTiRmaXRuZXNzPC1mb3JDWFJfTiRmaXRuZXNzKzEKCiMgdmVjdG9yIHRoYXQgdGVsbHMgd2hpY2ggYXJlIHRoZSBzZWxlY3Rpb24gcmVnaW1lcywgdGhlIGNvbHVtbnMgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIG5hbWUKbXkucmVnIDwtIGMoIlNSMSIsICJTUjIiLCJTUjQiLCJTUjUiKQoKIyBEbyBsaXN0IHBlciByZXBsaWNhdGUgYW5kIGVudmlyb25tZW50ClIxPC1saXN0KFNSMT0gc3Vic2V0KGZvckNYUl9OLCBSZXA9PTEgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1IyPSBzdWJzZXQoZm9yQ1hSX04sIFJlcD09MSAmIEZvY2FsPT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChmb3JDWFJfTiwgUmVwPT0xICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSNT0gc3Vic2V0KGZvckNYUl9OLCBSZXA9PTEgJiBGb2NhbD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSkKClIyPC1saXN0KFNSMT0gc3Vic2V0KGZvckNYUl9OLCBSZXA9PTIgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChmb3JDWFJfTiwgUmVwPT0yICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1I0IiwgIlNSNSIpXSwgU1I1PSBzdWJzZXQoZm9yQ1hSX04sIFJlcD09MiAmIEZvY2FsPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSNCIsICJTUjUiKV0pCgpSMzwtbGlzdChTUjE9IHN1YnNldChmb3JDWFJfTiwgUmVwPT0zICYgRm9jYWw9PSJTUjEiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KGZvckNYUl9OLCBSZXA9PTMgJiBGb2NhbD09IlNSMiIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoZm9yQ1hSX04sIFJlcD09MyAmIEZvY2FsPT0iU1I0IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjU9IHN1YnNldChmb3JDWFJfTiwgUmVwPT0zICYgRm9jYWw9PSJTUjUiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0pCgpSNDwtbGlzdChTUjE9IHN1YnNldChmb3JDWFJfTiwgUmVwPT00ICYgRm9jYWw9PSJTUjEiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KGZvckNYUl9OLCBSZXA9PTQgJiBGb2NhbD09IlNSMiIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoZm9yQ1hSX04sIFJlcD09NCAmIEZvY2FsPT0iU1I0IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjU9IHN1YnNldChmb3JDWFJfTiwgUmVwPT00ICYgRm9jYWw9PSJTUjUiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0pCgpSNTwtbGlzdChTUjE9IHN1YnNldChmb3JDWFJfTiwgUmVwPT01ICYgRm9jYWw9PSJTUjEiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KGZvckNYUl9OLCBSZXA9PTUgJiBGb2NhbD09IlNSMiIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoZm9yQ1hSX04sIFJlcD09NSAmIEZvY2FsPT0iU1I0IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjU9IHN1YnNldChmb3JDWFJfTiwgUmVwPT01ICYgRm9jYWw9PSJTUjUiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0pCgoKb2JzLlIxX3cwPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBteS5yZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAicGFpcndpc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGxhbWJkYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKc3RyKG9icy5SMV93MCkKb2JzLlIxX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvcgpvYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yCgoKCm9icy5SM193MDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChsYW1iZGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50cmEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCm9icy5SNF93MDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChsYW1iZGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50cmEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCm9icy5SNV93MDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChsYW1iZGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50cmEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCnN1bW1hcnkob2JzLlIxX3cwKQpzdW1tYXJ5KG9icy5SM193MCkKc3VtbWFyeShvYnMuUjRfdzApCnN1bW1hcnkob2JzLlI1X3cwKQoKCiMgRm9yIHJlcGxpY2F0ZSAyIHdlIG5lZWQgdG8gZG8gaXQgZGlmZmVyZW50bHkKCgpvYnMuUjJfdzBfc3IxPC1jeHJfcG1fZml0KGRhdGEgPSBSMltbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBteS5yZWdbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAicGFpcndpc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGxhbWJkYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKb2JzLlIyX3cwX3NyNDwtY3hyX3BtX2ZpdChkYXRhID0gUjJbWzJdXVt3aGljaChSMltbMl1dWywiU1IxIl09PTApLGMoImZpdG5lc3MiLCAiU1I0IildLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPU5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChsYW1iZGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpvYnMuUjJfdzBfc3I0X2ludGVyPC1jeHJfcG1fZml0KGRhdGEgPSBSMltbMl1dW3doaWNoKFIyW1syXV1bLCJTUjEiXSE9MCksYygiZml0bmVzcyIsICJTUjQiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9TlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGxpc3QobGFtYmRhPW9icy5SMl93MF9zcjQkbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpvYnMuUjJfdzBfc3I1PC1jeHJfcG1fZml0KGRhdGEgPSBSMltbM11dW3doaWNoKFIyW1szXV1bLCJTUjEiXT09MCksYygiZml0bmVzcyIsICJTUjUiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9TlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGxhbWJkYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCm9icy5SMl93MF9zcjVfaW50ZXI8LWN4cl9wbV9maXQoZGF0YSA9IFIyW1szXV1bd2hpY2goUjJbWzNdXVssIlNSMSJdIT0wKSxjKCJmaXRuZXNzIiwgIlNSNSIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID1OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QoYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gbGlzdChsYW1iZGE9b2JzLlIyX3cwX3NyNSRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCgojYWI8LWFidW5kYW5jZV9wcm9qZWN0aW9uKG9icy5SMV93MCwgdGltZXN0ZXBzID0gMSwgaW5pdGlhbF9hYnVuZGFuY2VzID0gYygzLDMsMywzKSkKCmBgYAoKcm93cyBpbiB0aGUgYWxwaGEgZWxlbWVudCBvZiB0aGUgcmV0dXJuaW5nIGxpc3QgY29ycmVzcG9uZCB0byBzcGVjaWVzIGkgYW5kIGNvbHVtbnMgdG8gc3BlY2llcyBqIGZvciBlYWNoIM6xaWogY29lZmZpY2llbnQuCgojIyMjIyMgZGF0YSB0YWJsZSBzdW1tYXJ5CgpgYGB7cn0KCmN4cl9wYXJhbV93MDwtZXhwYW5kLmdyaWQoVHVfUmVnaW1lPWMoIlNSMSIsICJTUjIiKSwgVGVfUmVnaW1lPWMoIlNSNCIsICJTUjUiKSwgUmVwbGljYXRlPWMoMSwyLDMsNCw1KSwgRW52aXJvbm1lbnQ9YygiTiIpKQpjeHJfcGFyYW1fdzAkVHVfbGFtYmRhPC0wCmN4cl9wYXJhbV93MCRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX3cwJFR1X2ludHJhPC0wCmN4cl9wYXJhbV93MCRUZV9pbnRyYTwtMApjeHJfcGFyYW1fdzAkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX3cwJFRlX2ludGVyPC0wCgojcmVtb3ZpbmcgU1IyIGZvciByZXBsaWNhdGUgMgpjeHJfcGFyYW1fdzA8LWN4cl9wYXJhbV93MFstd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09MiAmIGN4cl9wYXJhbV93MCRUdV9SZWdpbWU9PSJTUjIiKSxdCgoKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTEpLCJUdV9sYW1iZGEiXTwtb2JzLlIxX3cwJGxhbWJkYVsxOjJdCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT0xKSwiVGVfbGFtYmRhIl08LW9icy5SMV93MCRsYW1iZGFbYygzLDMsNCw0KV0KCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT0yKSwiVHVfbGFtYmRhIl08LW9icy5SMl93MF9zcjEkbGFtYmRhCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT0yKSwiVGVfbGFtYmRhIl08LWMob2JzLlIyX3cwX3NyNCRsYW1iZGEsb2JzLlIyX3cwX3NyNSRsYW1iZGEpCgpjeHJfcGFyYW1fdzBbd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09MyksIlR1X2xhbWJkYSJdPC1vYnMuUjNfdzAkbGFtYmRhWzE6Ml0KY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTMpLCJUZV9sYW1iZGEiXTwtb2JzLlIzX3cwJGxhbWJkYVtjKDMsMyw0LDQpXQoKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTQpLCJUdV9sYW1iZGEiXTwtb2JzLlI0X3cwJGxhbWJkYVsxOjJdCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT00KSwiVGVfbGFtYmRhIl08LW9icy5SNF93MCRsYW1iZGFbYygzLDMsNCw0KV0KCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT01KSwiVHVfbGFtYmRhIl08LW9icy5SNV93MCRsYW1iZGFbMToyXQpjeHJfcGFyYW1fdzBbd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09NSksIlRlX2xhbWJkYSJdPC1vYnMuUjVfdzAkbGFtYmRhW2MoMywzLDQsNCldCgoKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTEpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzEsMV0sIG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMiwyXSksIDIpCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMob2JzLlIxX3cwJGFscGhhX21hdHJpeFszLDNdLCBvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzQsNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fdzBbd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09MiksIlR1X2ludHJhIl08LW9icy5SMl93MF9zcjEkYWxwaGFfaW50cmEKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTIpLCJUZV9pbnRyYSJdPC1jKG9icy5SMl93MF9zcjQkYWxwaGFfaW50ZXIsIG9icy5SMl93MF9zcjUkYWxwaGFfaW50ZXIpCgpjeHJfcGFyYW1fdzBbd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09MyksIlR1X2ludHJhIl08LXJlcChjKG9icy5SM193MCRhbHBoYV9tYXRyaXhbMSwxXSwgb2JzLlIzX3cwJGFscGhhX21hdHJpeFsyLDJdKSwgMikKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTMpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzMsM10sIG9icy5SM193MCRhbHBoYV9tYXRyaXhbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT00KSwiVHVfaW50cmEiXTwtcmVwKGMob2JzLlI0X3cwJGFscGhhX21hdHJpeFsxLDFdLCBvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzIsMl0pLCAyKQpjeHJfcGFyYW1fdzBbd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09NCksIlRlX2ludHJhIl08LXJlcChjKG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMywzXSwgb2JzLlI0X3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTUpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzEsMV0sIG9icy5SNV93MCRhbHBoYV9tYXRyaXhbMiwyXSksIDIpCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT01KSwiVGVfaW50cmEiXTwtcmVwKGMob2JzLlI1X3cwJGFscGhhX21hdHJpeFszLDNdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzQsNF0pLCBlYWNoPTIpCgoKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTEpLCJUdV9pbnRlciJdPC1jKG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMSwzXSwgb2JzLlIxX3cwJGFscGhhX21hdHJpeFsyLDNdLG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMSw0XSwgb2JzLlIxX3cwJGFscGhhX21hdHJpeFsyLDRdKQpjeHJfcGFyYW1fdzBbd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09MSksIlRlX2ludGVyIl08LWMob2JzLlIxX3cwJGFscGhhX21hdHJpeFszLDFdLCBvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzMsMl0sb2JzLlIxX3cwJGFscGhhX21hdHJpeFs0LDFdLCBvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzQsMl0pCgpjeHJfcGFyYW1fdzBbd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09MiksIlR1X2ludGVyIl08LW9icy5SMl93MF9zcjEkYWxwaGFfaW50ZXIKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTIpLCJUZV9pbnRlciJdPC1jKG9icy5SMl93MF9zcjRfaW50ZXIkYWxwaGFfaW50ZXIsIG9icy5SMl93MF9zcjVfaW50ZXIkYWxwaGFfaW50ZXIpCgpjeHJfcGFyYW1fdzBbd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09MyksIlR1X2ludGVyIl08LWMob2JzLlIzX3cwJGFscGhhX21hdHJpeFsxLDNdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzIsM10sb2JzLlIzX3cwJGFscGhhX21hdHJpeFsxLDRdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzIsNF0pCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT0zKSwiVGVfaW50ZXIiXTwtYyhvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzMsMV0sIG9icy5SM193MCRhbHBoYV9tYXRyaXhbMywyXSxvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzQsMV0sIG9icy5SM193MCRhbHBoYV9tYXRyaXhbNCwyXSkKCmN4cl9wYXJhbV93MFt3aGljaChjeHJfcGFyYW1fdzAkUmVwbGljYXRlPT00KSwiVHVfaW50ZXIiXTwtYyhvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzEsM10sIG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMiwzXSxvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzEsNF0sIG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTQpLCJUZV9pbnRlciJdPC1jKG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMywxXSwgb2JzLlI0X3cwJGFscGhhX21hdHJpeFszLDJdLG9icy5SNF93MCRhbHBoYV9tYXRyaXhbNCwxXSwgb2JzLlI0X3cwJGFscGhhX21hdHJpeFs0LDJdKQoKY3hyX3BhcmFtX3cwW3doaWNoKGN4cl9wYXJhbV93MCRSZXBsaWNhdGU9PTUpLCJUdV9pbnRlciJdPC1jKG9icy5SNV93MCRhbHBoYV9tYXRyaXhbMSwzXSwgb2JzLlI1X3cwJGFscGhhX21hdHJpeFsyLDNdLG9icy5SNV93MCRhbHBoYV9tYXRyaXhbMSw0XSwgb2JzLlI1X3cwJGFscGhhX21hdHJpeFsyLDRdKQpjeHJfcGFyYW1fdzBbd2hpY2goY3hyX3BhcmFtX3cwJFJlcGxpY2F0ZT09NSksIlRlX2ludGVyIl08LWMob2JzLlI1X3cwJGFscGhhX21hdHJpeFszLDFdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzMsMl0sb2JzLlI1X3cwJGFscGhhX21hdHJpeFs0LDFdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzQsMl0pCgojIyMgTG93ZXIKCmN4cl9wYXJhbV93MF9sb3dlcjwtZXhwYW5kLmdyaWQoVHVfUmVnaW1lPWMoIlNSMSIsICJTUjIiKSwgVGVfUmVnaW1lPWMoIlNSNCIsICJTUjUiKSwgUmVwbGljYXRlPWMoMSwyLDMsNCw1KSwgRW52aXJvbm1lbnQ9YygiTiIpKQpjeHJfcGFyYW1fdzBfbG93ZXIkVHVfbGFtYmRhPC0wCmN4cl9wYXJhbV93MF9sb3dlciRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX3cwX2xvd2VyJFR1X2ludHJhPC0wCmN4cl9wYXJhbV93MF9sb3dlciRUZV9pbnRyYTwtMApjeHJfcGFyYW1fdzBfbG93ZXIkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX3cwX2xvd2VyJFRlX2ludGVyPC0wCgojcmVtb3ZpbmcgU1IyIGZvciByZXBsaWNhdGUgMgpjeHJfcGFyYW1fdzBfbG93ZXI8LWN4cl9wYXJhbV93MF9sb3dlclstd2hpY2goY3hyX3BhcmFtX3cwX2xvd2VyJFJlcGxpY2F0ZT09MiAmIGN4cl9wYXJhbV93MF9sb3dlciRUdV9SZWdpbWU9PSJTUjIiKSxdCgoKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9sYW1iZGEiXTwtcmVwKGMob2JzLlIxX3cwJGxhbWJkYVsxXS1vYnMuUjFfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzFdLCBvYnMuUjFfdzAkbGFtYmRhWzJdLW9icy5SMV93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMl0pLCAyKQpjeHJfcGFyYW1fdzBfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwX2xvd2VyJFJlcGxpY2F0ZT09MSksIlRlX2xhbWJkYSJdPC1yZXAoYyhvYnMuUjFfdzAkbGFtYmRhWzNdLW9icy5SMV93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbM10sIG9icy5SMV93MCRsYW1iZGFbNF0tb2JzLlIxX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvcls0XSksIGVhY2g9MikKCmN4cl9wYXJhbV93MF9sb3dlclt3aGljaChjeHJfcGFyYW1fdzBfbG93ZXIkUmVwbGljYXRlPT0yKSwiVHVfbGFtYmRhIl08LW9icy5SMl93MF9zcjEkbGFtYmRhLW9icy5SMl93MF9zcjEkbGFtYmRhX3N0YW5kYXJkX2Vycm9yCmN4cl9wYXJhbV93MF9sb3dlclt3aGljaChjeHJfcGFyYW1fdzBfbG93ZXIkUmVwbGljYXRlPT0yKSwiVGVfbGFtYmRhIl08LWMob2JzLlIyX3cwX3NyNCRsYW1iZGEtb2JzLlIyX3cwX3NyNCRsYW1iZGFfc3RhbmRhcmRfZXJyb3Isb2JzLlIyX3cwX3NyNSRsYW1iZGEtb2JzLlIyX3cwX3NyNSRsYW1iZGFfc3RhbmRhcmRfZXJyb3IpCgpjeHJfcGFyYW1fdzBfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwX2xvd2VyJFJlcGxpY2F0ZT09MyksIlR1X2xhbWJkYSJdPC1yZXAoYyhvYnMuUjNfdzAkbGFtYmRhWzFdLW9icy5SM193MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMV0sIG9icy5SM193MCRsYW1iZGFbMl0tb2JzLlIzX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclsyXSksIDIpCmN4cl9wYXJhbV93MF9sb3dlclt3aGljaChjeHJfcGFyYW1fdzBfbG93ZXIkUmVwbGljYXRlPT0zKSwiVGVfbGFtYmRhIl08LXJlcChjKG9icy5SM193MCRsYW1iZGFbM10tb2JzLlIzX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclszXSwgb2JzLlIzX3cwJGxhbWJkYVs0XS1vYnMuUjNfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTQpLCJUdV9sYW1iZGEiXTwtcmVwKGMob2JzLlI0X3cwJGxhbWJkYVsxXS1vYnMuUjRfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzFdLCBvYnMuUjRfdzAkbGFtYmRhWzJdLW9icy5SNF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMl0pLCAyKQpjeHJfcGFyYW1fdzBfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwX2xvd2VyJFJlcGxpY2F0ZT09NCksIlRlX2xhbWJkYSJdPC1yZXAoYyhvYnMuUjRfdzAkbGFtYmRhWzNdLW9icy5SNF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbM10sIG9icy5SNF93MCRsYW1iZGFbNF0tb2JzLlI0X3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvcls0XSksIGVhY2g9MikKCmN4cl9wYXJhbV93MF9sb3dlclt3aGljaChjeHJfcGFyYW1fdzBfbG93ZXIkUmVwbGljYXRlPT01KSwiVHVfbGFtYmRhIl08LXJlcChjKG9icy5SNV93MCRsYW1iZGFbMV0tb2JzLlI1X3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclsxXSwgb2JzLlI1X3cwJGxhbWJkYVsyXS1vYnMuUjVfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzJdKSwgMikKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTUpLCJUZV9sYW1iZGEiXTwtcmVwKGMob2JzLlI1X3cwJGxhbWJkYVszXS1vYnMuUjVfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzNdLCBvYnMuUjVfdzAkbGFtYmRhWzRdLW9icy5SNV93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbNF0pLCBlYWNoPTIpCgoKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzEsMV0tb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzIsMl0tb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTEpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzMsM10tb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzQsNF0tb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTIpLCJUdV9pbnRyYSJdPC1vYnMuUjJfdzBfc3IxJGFscGhhX2ludHJhLW9icy5SMl93MF9zcjEkYWxwaGFfaW50cmFfc3RhbmRhcmRfZXJyb3IKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRyYSJdPC1jKG9icy5SMl93MF9zcjQkYWxwaGFfaW50ZXItb2JzLlIyX3cwX3NyNCRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvciwgb2JzLlIyX3cwX3NyNSRhbHBoYV9pbnRlci1vYnMuUjJfdzBfc3I1JGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yKQoKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTMpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzEsMV0tb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzIsMl0tb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzMsM10tb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzQsNF0tb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTQpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzEsMV0tb2JzLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzIsMl0tb2JzLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzMsM10tb2JzLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzQsNF0tb2JzLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTUpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzEsMV0tb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzIsMl0tb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzMsM10tb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzQsNF0tb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKCmN4cl9wYXJhbV93MF9sb3dlclt3aGljaChjeHJfcGFyYW1fdzBfbG93ZXIkUmVwbGljYXRlPT0xKSwiVHVfaW50ZXIiXTwtYyhvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzEsM10tb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzIsM10tb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMSw0XS1vYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMiw0XS1vYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV93MF9sb3dlclt3aGljaChjeHJfcGFyYW1fdzBfbG93ZXIkUmVwbGljYXRlPT0xKSwiVGVfaW50ZXIiXTwtYyhvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzMsMV0tb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzMsMl0tb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLG9icy5SMV93MCRhbHBoYV9tYXRyaXhbNCwxXS1vYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIG9icy5SMV93MCRhbHBoYV9tYXRyaXhbNCwyXS1vYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fdzBfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwX2xvd2VyJFJlcGxpY2F0ZT09MiksIlR1X2ludGVyIl08LW9icy5SMl93MF9zcjEkYWxwaGFfaW50ZXItb2JzLlIyX3cwX3NyMSRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvcgpjeHJfcGFyYW1fdzBfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwX2xvd2VyJFJlcGxpY2F0ZT09MiksIlRlX2ludGVyIl08LWMob2JzLlIyX3cwX3NyNF9pbnRlciRhbHBoYV9pbnRlci1vYnMuUjJfdzBfc3I0X2ludGVyJGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yLCBvYnMuUjJfdzBfc3I1X2ludGVyJGFscGhhX2ludGVyLW9icy5SMl93MF9zcjVfaW50ZXIkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3IpCgpjeHJfcGFyYW1fdzBfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwX2xvd2VyJFJlcGxpY2F0ZT09MyksIlR1X2ludGVyIl08LWMob2JzLlIzX3cwJGFscGhhX21hdHJpeFsxLDNdLW9icy5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgb2JzLlIzX3cwJGFscGhhX21hdHJpeFsyLDNdLW9icy5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzEsNF0tb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzIsNF0tb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fdzBfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwX2xvd2VyJFJlcGxpY2F0ZT09MyksIlRlX2ludGVyIl08LWMob2JzLlIzX3cwJGFscGhhX21hdHJpeFszLDFdLW9icy5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgb2JzLlIzX3cwJGFscGhhX21hdHJpeFszLDJdLW9icy5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzQsMV0tb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzQsMl0tb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTQpLCJUdV9pbnRlciJdPC1jKG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMSwzXS1vYnMuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMiwzXS1vYnMuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sb2JzLlI0X3cwJGFscGhhX21hdHJpeFsxLDRdLW9icy5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgb2JzLlI0X3cwJGFscGhhX21hdHJpeFsyLDRdLW9icy5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX3cwX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MF9sb3dlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRlciJdPC1jKG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMywxXS1vYnMuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMywyXS1vYnMuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sb2JzLlI0X3cwJGFscGhhX21hdHJpeFs0LDFdLW9icy5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgb2JzLlI0X3cwJGFscGhhX21hdHJpeFs0LDJdLW9icy5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV93MF9sb3dlclt3aGljaChjeHJfcGFyYW1fdzBfbG93ZXIkUmVwbGljYXRlPT01KSwiVHVfaW50ZXIiXTwtYyhvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzEsM10tb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzIsM10tb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLG9icy5SNV93MCRhbHBoYV9tYXRyaXhbMSw0XS1vYnMuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIG9icy5SNV93MCRhbHBoYV9tYXRyaXhbMiw0XS1vYnMuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV93MF9sb3dlclt3aGljaChjeHJfcGFyYW1fdzBfbG93ZXIkUmVwbGljYXRlPT01KSwiVGVfaW50ZXIiXTwtYyhvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzMsMV0tb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzMsMl0tb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLG9icy5SNV93MCRhbHBoYV9tYXRyaXhbNCwxXS1vYnMuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIG9icy5SNV93MCRhbHBoYV9tYXRyaXhbNCwyXS1vYnMuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgojIyMgdXBwZXIKCmN4cl9wYXJhbV93MF91cHBlcjwtZXhwYW5kLmdyaWQoVHVfUmVnaW1lPWMoIlNSMSIsICJTUjIiKSwgVGVfUmVnaW1lPWMoIlNSNCIsICJTUjUiKSwgUmVwbGljYXRlPWMoMSwyLDMsNCw1KSwgRW52aXJvbm1lbnQ9YygiTiIpKQpjeHJfcGFyYW1fdzBfdXBwZXIkVHVfbGFtYmRhPC0wCmN4cl9wYXJhbV93MF91cHBlciRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX3cwX3VwcGVyJFR1X2ludHJhPC0wCmN4cl9wYXJhbV93MF91cHBlciRUZV9pbnRyYTwtMApjeHJfcGFyYW1fdzBfdXBwZXIkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX3cwX3VwcGVyJFRlX2ludGVyPC0wCgojcmVtb3ZpbmcgU1IyIGZvciByZXBsaWNhdGUgMgpjeHJfcGFyYW1fdzBfdXBwZXI8LWN4cl9wYXJhbV93MF91cHBlclstd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MiAmIGN4cl9wYXJhbV93MF91cHBlciRUdV9SZWdpbWU9PSJTUjIiKSxdCgoKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTEpLCJUdV9sYW1iZGEiXTwtcmVwKGMob2JzLlIxX3cwJGxhbWJkYVsxXStvYnMuUjFfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzFdLCBvYnMuUjFfdzAkbGFtYmRhWzJdK29icy5SMV93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMl0pLCAyKQpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MSksIlRlX2xhbWJkYSJdPC1yZXAoYyhvYnMuUjFfdzAkbGFtYmRhWzNdK29icy5SMV93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbM10sIG9icy5SMV93MCRsYW1iZGFbNF0rb2JzLlIxX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvcls0XSksIGVhY2g9MikKCmN4cl9wYXJhbV93MF91cHBlclt3aGljaChjeHJfcGFyYW1fdzBfdXBwZXIkUmVwbGljYXRlPT0yKSwiVHVfbGFtYmRhIl08LW9icy5SMl93MF9zcjEkbGFtYmRhKyBvYnMuUjJfdzBfc3IxJGxhbWJkYV9zdGFuZGFyZF9lcnJvcgpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MiksIlRlX2xhbWJkYSJdPC1jKG9icy5SMl93MF9zcjQkbGFtYmRhK29icy5SMl93MF9zcjQkbGFtYmRhX3N0YW5kYXJkX2Vycm9yLCBvYnMuUjJfdzBfc3I1JGxhbWJkYStvYnMuUjJfdzBfc3I1JGxhbWJkYV9zdGFuZGFyZF9lcnJvcikKCmN4cl9wYXJhbV93MF91cHBlclt3aGljaChjeHJfcGFyYW1fdzBfdXBwZXIkUmVwbGljYXRlPT0zKSwiVHVfbGFtYmRhIl08LXJlcChjKG9icy5SM193MCRsYW1iZGFbMV0rb2JzLlIzX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclsxXSwgb2JzLlIzX3cwJGxhbWJkYVsyXStvYnMuUjNfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzJdKSwgMikKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTMpLCJUZV9sYW1iZGEiXTwtcmVwKGMob2JzLlIzX3cwJGxhbWJkYVszXStvYnMuUjNfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzNdLCBvYnMuUjNfdzAkbGFtYmRhWzRdK29icy5SM193MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09NCksIlR1X2xhbWJkYSJdPC1yZXAoYyhvYnMuUjRfdzAkbGFtYmRhWzFdK29icy5SNF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMV0sIG9icy5SNF93MCRsYW1iZGFbMl0rb2JzLlI0X3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclsyXSksIDIpCmN4cl9wYXJhbV93MF91cHBlclt3aGljaChjeHJfcGFyYW1fdzBfdXBwZXIkUmVwbGljYXRlPT00KSwiVGVfbGFtYmRhIl08LXJlcChjKG9icy5SNF93MCRsYW1iZGFbM10rb2JzLlI0X3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclszXSwgb2JzLlI0X3cwJGxhbWJkYVs0XStvYnMuUjRfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTUpLCJUdV9sYW1iZGEiXTwtcmVwKGMob2JzLlI1X3cwJGxhbWJkYVsxXStvYnMuUjVfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzFdLCBvYnMuUjVfdzAkbGFtYmRhWzJdK29icy5SNV93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMl0pLCAyKQpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09NSksIlRlX2xhbWJkYSJdPC1yZXAoYyhvYnMuUjVfdzAkbGFtYmRhWzNdK29icy5SNV93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbM10sIG9icy5SNV93MCRsYW1iZGFbNF0rb2JzLlI1X3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvcls0XSksIGVhY2g9MikKCgpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MSksIlR1X2ludHJhIl08LXJlcChjKG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMSwxXStvYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMiwyXStvYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MSksIlRlX2ludHJhIl08LXJlcChjKG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMywzXStvYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsM10sIG9icy5SMV93MCRhbHBoYV9tYXRyaXhbNCw0XStvYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MiksIlR1X2ludHJhIl08LW9icy5SMl93MF9zcjEkYWxwaGFfaW50cmErb2JzLlIyX3cwX3NyMSRhbHBoYV9pbnRyYV9zdGFuZGFyZF9lcnJvcgpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MiksIlRlX2ludHJhIl08LWMob2JzLlIyX3cwX3NyNCRhbHBoYV9pbnRlcitvYnMuUjJfdzBfc3I0JGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yLCAgb2JzLlIyX3cwX3NyNSRhbHBoYV9pbnRlcitvYnMuUjJfdzBfc3I1JGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yKQoKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTMpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzEsMV0rb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzIsMl0rb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzMsM10rb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzQsNF0rb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTQpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzEsMV0rb2JzLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzIsMl0rb2JzLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzMsM10rb2JzLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBvYnMuUjRfdzAkYWxwaGFfbWF0cml4WzQsNF0rb2JzLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTUpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzEsMV0rb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzIsMl0rb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzMsM10rb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzQsNF0rb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKCmN4cl9wYXJhbV93MF91cHBlclt3aGljaChjeHJfcGFyYW1fdzBfdXBwZXIkUmVwbGljYXRlPT0xKSwiVHVfaW50ZXIiXTwtYyhvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzEsM10rb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzIsM10rb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMSw0XStvYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIG9icy5SMV93MCRhbHBoYV9tYXRyaXhbMiw0XStvYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV93MF91cHBlclt3aGljaChjeHJfcGFyYW1fdzBfdXBwZXIkUmVwbGljYXRlPT0xKSwiVGVfaW50ZXIiXTwtYyhvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzMsMV0rb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBvYnMuUjFfdzAkYWxwaGFfbWF0cml4WzMsMl0rb2JzLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLG9icy5SMV93MCRhbHBoYV9tYXRyaXhbNCwxXStvYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIG9icy5SMV93MCRhbHBoYV9tYXRyaXhbNCwyXStvYnMuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MiksIlR1X2ludGVyIl08LWMob2JzLlIyX3cwX3NyMSRhbHBoYV9pbnRlcitvYnMuUjJfdzBfc3IxJGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yKQpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MiksIlRlX2ludGVyIl08LWMob2JzLlIyX3cwX3NyNF9pbnRlciRhbHBoYV9pbnRlcitvYnMuUjJfdzBfc3I0X2ludGVyJGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yLCBvYnMuUjJfdzBfc3I1X2ludGVyJGFscGhhX2ludGVyK29icy5SMl93MF9zcjVfaW50ZXIkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3IpCgpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MyksIlR1X2ludGVyIl08LWMob2JzLlIzX3cwJGFscGhhX21hdHJpeFsxLDNdK29icy5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgb2JzLlIzX3cwJGFscGhhX21hdHJpeFsyLDNdK29icy5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzEsNF0rb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzIsNF0rb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fdzBfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwX3VwcGVyJFJlcGxpY2F0ZT09MyksIlRlX2ludGVyIl08LWMob2JzLlIzX3cwJGFscGhhX21hdHJpeFszLDFdK29icy5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgb2JzLlIzX3cwJGFscGhhX21hdHJpeFszLDJdK29icy5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzQsMV0rb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBvYnMuUjNfdzAkYWxwaGFfbWF0cml4WzQsMl0rb2JzLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTQpLCJUdV9pbnRlciJdPC1jKG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMSwzXStvYnMuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMiwzXStvYnMuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sb2JzLlI0X3cwJGFscGhhX21hdHJpeFsxLDRdK29icy5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgb2JzLlI0X3cwJGFscGhhX21hdHJpeFsyLDRdK29icy5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX3cwX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MF91cHBlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRlciJdPC1jKG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMywxXStvYnMuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIG9icy5SNF93MCRhbHBoYV9tYXRyaXhbMywyXStvYnMuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sb2JzLlI0X3cwJGFscGhhX21hdHJpeFs0LDFdK29icy5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgb2JzLlI0X3cwJGFscGhhX21hdHJpeFs0LDJdK29icy5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV93MF91cHBlclt3aGljaChjeHJfcGFyYW1fdzBfdXBwZXIkUmVwbGljYXRlPT01KSwiVHVfaW50ZXIiXTwtYyhvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzEsM10rb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzIsM10rb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLG9icy5SNV93MCRhbHBoYV9tYXRyaXhbMSw0XStvYnMuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIG9icy5SNV93MCRhbHBoYV9tYXRyaXhbMiw0XStvYnMuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV93MF91cHBlclt3aGljaChjeHJfcGFyYW1fdzBfdXBwZXIkUmVwbGljYXRlPT01KSwiVGVfaW50ZXIiXTwtYyhvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzMsMV0rb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBvYnMuUjVfdzAkYWxwaGFfbWF0cml4WzMsMl0rb2JzLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLG9icy5SNV93MCRhbHBoYV9tYXRyaXhbNCwxXStvYnMuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIG9icy5SNV93MCRhbHBoYV9tYXRyaXhbNCwyXStvYnMuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpgYGAKCiMjIyMjIENhZG1pdW0KCmBgYHtyfQojIG1vZGlmeWluZyBkYXRhIGZyYW1lIHRvIGZpdCB0aGUgdHlwZSBvZiBzZXR1cCB0aGF0IGlzIG5lZWQgZm9yIENYUgpmb3JDWFJfQ2Q8LXN1YnNldChjYSwgRW52PT0iQ2QiKVssYygiUmVwIiwgIkZvY2FsU1IiLCAiQ29tcFNSIiwgIkRlbnMiLCAiVGVGZW1hbGVzIiwgIlR1RmVtYWxlcyIpXQoKZm9yQ1hSX0NkJEZvY2FsPC1tYXB2YWx1ZXMoZm9yQ1hSX0NkJEZvY2FsU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCJTUjUiKSkKZm9yQ1hSX0NkJENvbXBTUjI8LW1hcHZhbHVlcyhmb3JDWFJfQ2QkQ29tcFNSLCBjKDEsMiw0LDUpLCBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikpCgpmb3JDWFJfQ2QkQ29tcDwtc2FwcGx5KGMoMTpsZW5ndGgoZm9yQ1hSX0NkWywxXSkpLCBmdW5jdGlvbih4KXsKICBpZihpcy5uYShmb3JDWFJfQ2QkQ29tcFNSMlt4XSkpewogICAgYTwtIGZvckNYUl9DZCRGb2NhbFt4XQogIH1lbHNlewogICAgYTwtZm9yQ1hSX0NkJENvbXBTUjJbeF0KICB9CiAgCiAgYQp9KQoKYXV4PC1kYXRhLmZyYW1lKFNSMT1yZXAoMCwgbGVuZ3RoKGZvckNYUl9DZFssMV0pKSwgU1IyPXJlcCgwLCBsZW5ndGgoZm9yQ1hSX0NkWywxXSkpLCBTUjQ9cmVwKDAsIGxlbmd0aChmb3JDWFJfQ2RbLDFdKSksIFNSNT1yZXAoMCwgbGVuZ3RoKGZvckNYUl9DZFssMV0pKSkKCmZvcihpIGluIDE6bGVuZ3RoKGZvckNYUl9DZFssMV0pKXsKICAjY29sdW5hIG9uZGUgcG9yIGZvY2FpcwogIGNvbHVuYUY8LXdoaWNoKGNvbG5hbWVzKGF1eCk9PWZvckNYUl9DZCRGb2NhbFtpXSkKICAjY29sdW5hIG9uZGUgcG9yIGNvbXBldGlkb3JzCiAgY29sdW5hQzwtd2hpY2goY29sbmFtZXMoYXV4KT09Zm9yQ1hSX0NkJENvbXBbaV0pCiAgCiAgI2lmIGl0cyB0aGUgc2FtZSByZWdpbWUKICBpZihmb3JDWFJfQ2QkRm9jYWxbaV09PWZvckNYUl9DZCRDb21wW2ldICYgZm9yQ1hSX0NkJERlbnNbaV09PTEpewogICAgYXV4W2ksY29sdW5hRl08LWZvckNYUl9DZCREZW5zW2ldLTEKICAgIAogIH1lbHNlIGlmKGZvckNYUl9DZCRGb2NhbFtpXT09Zm9yQ1hSX0NkJENvbXBbaV0pewogICAgYXV4W2ksY29sdW5hRl08LWZvckNYUl9DZCREZW5zW2ldLTEKICB9ZWxzZXsgI2lmIGl0IGlzIGhldGVyb3NwZWNpZmljIHRoZW4gaXRzIC0xIGZvciB0aGUgY29tcGV0aXRvcnMgKGJlY2F1c2Ugb2YgdGhlIGZvY2FsKSBhbmQgaXRzIG9uZSBmb3IgdGhlIGZvY2FsCiAgICBhdXhbaSxjb2x1bmFDXTwtZm9yQ1hSX0NkJERlbnNbaV0tMQogICAgYXV4W2ksIGNvbHVuYUZdPC0xCiAgfQogIAp9Cgpmb3JDWFJfQ2Q8LWNiaW5kKGZvckNYUl9DZCwgYXV4KQoKZm9yQ1hSX0NkJGZpdG5lc3M8LXNhcHBseShjKDE6bGVuZ3RoKGZvckNYUl9DZFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgY29sRjwtd2hpY2goY29sbmFtZXMoZm9yQ1hSX0NkKT09Zm9yQ1hSX0NkJEZvY2FsW3hdKQogIAogIGlmKGZvckNYUl9DZCRGb2NhbFt4XT09IlNSMSIpewogICAgYTwtZm9yQ1hSX0NkJFR1RmVtYWxlc1t4XS9mb3JDWFJfQ2QkU1IxW3hdCiAgfSBlbHNlIGlmKGZvckNYUl9DZCRGb2NhbFt4XT09IlNSMiIpewogICAgYTwtZm9yQ1hSX0NkJFR1RmVtYWxlc1t4XS9mb3JDWFJfQ2QkU1IyW3hdCiAgfSBlbHNlIGlmKGZvckNYUl9DZCRGb2NhbFt4XT09IlNSNCIpewogICAgYTwtZm9yQ1hSX0NkJFRlRmVtYWxlc1t4XS9mb3JDWFJfQ2QkU1I0W3hdCiAgfSBlbHNlIGlmKGZvckNYUl9DZCRGb2NhbFt4XT09IlNSNSIpewogICAgYTwtZm9yQ1hSX0NkJFRlRmVtYWxlc1t4XS9mb3JDWFJfQ2QkU1I1W3hdCiAgfQogIAogIGEKfSkKCnN1YnNldChjYSwgRW52PT0iQ2QiICYgUmVwPT0iMiIgJiBGb2NhbFNSPT01ICZUeXBlPT0iSU5URVIiKVssYygiUmVwIiwgIkZvY2FsU1IiLCAiQ29tcFNSIiwgIkRlbnMiLCAiVGVGZW1hbGVzIiwgIkJsb2NrIildCgojcmVtb3Zpbmcgcm93cyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gZGF0YSBmb3IgZml0bmVzcwojZm9yQ1hSX0NkPC1mb3JDWFJfQ2RbLXdoaWNoKGlzLm5hKGZvckNYUl9DZCRmaXRuZXNzKSksXQojZm9yQ1hSX0NkJGZpdG5lc3M8LWZvckNYUl9DZCRmaXRuZXNzKzEKCmZvckNYUl9DZFt3aGljaChmb3JDWFJfQ2QkZml0bmVzcz09Ii1JbmYiIHwgZm9yQ1hSX0NkJGZpdG5lc3M9PSJJbmYiKSwiZml0bmVzcyJdPC0wCgojMCB0byAxIHRvIG1haW5yYWluIGRhdGEKZm9yQ1hSX0NkPC1mb3JDWFJfQ2RbLXdoaWNoKGlzLm5hKGZvckNYUl9DZCRmaXRuZXNzKSksXQpmb3JDWFJfQ2QkZml0bmVzczwtZm9yQ1hSX0NkJGZpdG5lc3MrMQoKCgojIHZlY3RvciB0aGF0IHRlbGxzIHdoaWNoIGFyZSB0aGUgc2VsZWN0aW9uIHJlZ2ltZXMsIHRoZSBjb2x1bW5zIGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSBuYW1lCm15LnJlZyA8LSBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikKCiMgRG8gbGlzdCBwZXIgcmVwbGljYXRlIGFuZCBlbnZpcm9ubWVudApSMV9DZDwtbGlzdChTUjE9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09MSAmIEZvY2FsPT0iU1IxIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjI9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09MSAmIEZvY2FsPT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09MSAmIEZvY2FsPT0iU1I0IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjU9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09MSAmIEZvY2FsPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildKQoKUjJfQ2Q8LWxpc3QoU1IxPSBzdWJzZXQoZm9yQ1hSX0NkLCBSZXA9PTIgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09MiAmIEZvY2FsPT0iU1I0IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjU9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09MiAmIEZvY2FsPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildKQoKUjNfQ2Q8LWxpc3QoU1IxPSBzdWJzZXQoZm9yQ1hSX0NkLCBSZXA9PTMgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1IyPSBzdWJzZXQoZm9yQ1hSX0NkLCBSZXA9PTMgJiBGb2NhbD09IlNSMiIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoZm9yQ1hSX0NkLCBSZXA9PTMgJiBGb2NhbD09IlNSNCIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1I1PSBzdWJzZXQoZm9yQ1hSX0NkLCBSZXA9PTMgJiBGb2NhbD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSkKClI0X0NkPC1saXN0KFNSMT0gc3Vic2V0KGZvckNYUl9DZCwgUmVwPT00ICYgRm9jYWw9PSJTUjEiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KGZvckNYUl9DZCwgUmVwPT00ICYgRm9jYWw9PSJTUjIiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSND0gc3Vic2V0KGZvckNYUl9DZCwgUmVwPT00ICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSNT0gc3Vic2V0KGZvckNYUl9DZCwgUmVwPT00ICYgRm9jYWw9PSJTUjUiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0pCgpSNV9DZDwtbGlzdChTUjE9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09NSAmIEZvY2FsPT0iU1IxIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjI9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09NSAmIEZvY2FsPT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09NSAmIEZvY2FsPT0iU1I0IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjU9IHN1YnNldChmb3JDWFJfQ2QsIFJlcD09NSAmIEZvY2FsPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildKQoKCm9icy5SMV9DZF93MDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSMV9DZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChsYW1iZGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50cmEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCiMgcmVwbGljYXRlIDIgYmVsb3cKCgpvYnMuUjNfQ2RfdzA8LWN4cl9wbV9tdWx0aWZpdChkYXRhID0gUjNfQ2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IG15LnJlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJwYWlyd2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QobGFtYmRhID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludHJhID0gMC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPTEwKQoKb2JzLlI0X0NkX3cwPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFI0X0NkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBteS5yZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAicGFpcndpc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGxhbWJkYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKb2JzLlI1X0NkX3cwPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFI1X0NkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBteS5yZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAicGFpcndpc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGxhbWJkYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKc3VtbWFyeShvYnMuUjFfQ2RfdzApCiNzdW1tYXJ5KG9icy5SMl9DZF93MCkKc3VtbWFyeShvYnMuUjNfQ2RfdzApCnN1bW1hcnkob2JzLlI0X0NkX3cwKQpzdW1tYXJ5KG9icy5SNV9DZF93MCkKCiMjIyBGb3IgcmVwbGljYXRlIEkgY2FuJ3QgZmluZCBnb29kIGluaXRpYWwgY29uZGl0aW9ucywgbGV0cyBkbyB0aGlzIGJ5IGhhbmQKCiMgb2JzLlIyX0NkX3cwPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFIyX0NkLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IG15LnJlZ1tjKDEsMyw0KV0sCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIkJIIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJwYWlyd2lzZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QobGFtYmRhID0gMSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50cmEgPSAwLjEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gTlVMTCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0xMCkKCiMgVGhpcyBvbmUgd29ya3Mgd2VsbApvYnMuUjJfQ2RfdzBfc3IxPC1jeHJfcG1fZml0KGRhdGEgPSBSMl9DZFtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBteS5yZWdbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAicGFpcndpc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGxhbWJkYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKI2ZvciByZXBsaWNhdGUgMiB3ZSB3aWxsIGRvIHRoZSBmaXR0aW5nIGJ5IGhhbmQgYmVjYXVzZSB3ZSBtYXkgbmVlZCB0byBzY2FsZSB0aGUgcGFyYW1ldGVycwoKb2JzLlIyX0NkX3cwX3NyNDwtY3hyX3BtX2ZpdChkYXRhID0gUjJfQ2RbWzJdXVt3aGljaChSMl9DZFtbMl1dWywiU1IxIl09PTApLGMoImZpdG5lc3MiLCAiU1I0IildLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QobGFtYmRhID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKIG9icy5SMl9DZF93MF9zcjU8LWN4cl9wbV9maXQoZGF0YSA9IFIyX0NkW1szXV1bd2hpY2goUjJfQ2RbWzNdXVssIlNSMSJdPT0wKSxjKCJmaXRuZXNzIiwgIlNSNSIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGxhbWJkYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKIApvYnMuUjJfQ2RfdzBfc3I0X2ludGVyPC1jeHJfcG1fZml0KGRhdGEgPSBSMl9DZFtbMl1dW3doaWNoKFIyX0NkW1syXV1bLCJTUjEiXSE9MCksYygiZml0bmVzcyIsICJTUjEiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdCggYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gbGlzdChsYW1iZGE9b2JzLlIyX0NkX3cwX3NyNCRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCiBvYnMuUjJfQ2RfdzBfc3I1X2ludGVyPC1jeHJfcG1fZml0KGRhdGEgPSBSMl9DZFtbM11dW3doaWNoKFIyX0NkW1szXV1bLCJTUjEiXSE9MCksYygiZml0bmVzcyIsICJTUjEiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdCggYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gbGlzdChsYW1iZGE9b2JzLlIyX0NkX3cwX3NyNSRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCgoKYGBgCgoKCiMjIyMjIyBkYXRhIHRhYmxlIHN1bW1hcnkKCmBgYHtyfQoKY3hyX3BhcmFtX3cwQzwtZXhwYW5kLmdyaWQoVHVfUmVnaW1lPWMoIlNSMSIsICJTUjIiKSwgVGVfUmVnaW1lPWMoIlNSNCIsICJTUjUiKSwgUmVwbGljYXRlPWMoMSwyLDMsNCw1KSwgRW52aXJvbm1lbnQ9YygiQ2QiKSkKY3hyX3BhcmFtX3cwQyRUdV9sYW1iZGE8LTAKY3hyX3BhcmFtX3cwQyRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX3cwQyRUdV9pbnRyYTwtMApjeHJfcGFyYW1fdzBDJFRlX2ludHJhPC0wCmN4cl9wYXJhbV93MEMkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX3cwQyRUZV9pbnRlcjwtMAoKI3JlbW92aW5nIFNSMiBmb3IgcmVwbGljYXRlIDIKY3hyX3BhcmFtX3cwQzwtY3hyX3BhcmFtX3cwQ1std2hpY2goY3hyX3BhcmFtX3cwQyRSZXBsaWNhdGU9PTIgJiBjeHJfcGFyYW1fdzBDJFR1X1JlZ2ltZT09IlNSMiIpLF0KCgpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT0xKSwiVHVfbGFtYmRhIl08LW9icy5SMV9DZF93MCRsYW1iZGFbMToyXQpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT0xKSwiVGVfbGFtYmRhIl08LW9icy5SMV9DZF93MCRsYW1iZGFbYygzLDMsNCw0KV0KCmN4cl9wYXJhbV93MENbd2hpY2goY3hyX3BhcmFtX3cwQyRSZXBsaWNhdGU9PTIpLCJUdV9sYW1iZGEiXTwtb2JzLlIyX0NkX3cwX3NyMSRsYW1iZGEKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09MiksIlRlX2xhbWJkYSJdPC1jKG9icy5SMl9DZF93MF9zcjQkbGFtYmRhLCBvYnMuUjJfQ2RfdzBfc3I1JGxhbWJkYSkKCmN4cl9wYXJhbV93MENbd2hpY2goY3hyX3BhcmFtX3cwQyRSZXBsaWNhdGU9PTMpLCJUdV9sYW1iZGEiXTwtb2JzLlIzX0NkX3cwJGxhbWJkYVsxOjJdCmN4cl9wYXJhbV93MENbd2hpY2goY3hyX3BhcmFtX3cwQyRSZXBsaWNhdGU9PTMpLCJUZV9sYW1iZGEiXTwtb2JzLlIzX0NkX3cwJGxhbWJkYVtjKDMsMyw0LDQpXQoKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09NCksIlR1X2xhbWJkYSJdPC1vYnMuUjRfQ2RfdzAkbGFtYmRhWzE6Ml0KY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09NCksIlRlX2xhbWJkYSJdPC1vYnMuUjRfQ2RfdzAkbGFtYmRhW2MoMywzLDQsNCldCgpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT01KSwiVHVfbGFtYmRhIl08LW9icy5SNV9DZF93MCRsYW1iZGFbMToyXQpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT01KSwiVGVfbGFtYmRhIl08LW9icy5SNV9DZF93MCRsYW1iZGFbYygzLDMsNCw0KV0KCgpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT0xKSwiVHVfaW50cmEiXTwtcmVwKGMob2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFsxLDFdLCBvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzIsMl0pLCAyKQpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMob2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFszLDNdLCBvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzQsNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT0yKSwiVHVfaW50cmEiXTwtb2JzLlIyX0NkX3cwX3NyMSRhbHBoYV9pbnRyYQpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT0yKSwiVGVfaW50cmEiXTwtYyhvYnMuUjJfQ2RfdzBfc3I0JGFscGhhX2ludGVyLCBvYnMuUjJfQ2RfdzBfc3I1JGFscGhhX2ludGVyKQoKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09MyksIlR1X2ludHJhIl08LXJlcChjKG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMSwxXSwgb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFsyLDJdKSwgMikKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09MyksIlRlX2ludHJhIl08LXJlcChjKG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMywzXSwgb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09NCksIlR1X2ludHJhIl08LXJlcChjKG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMSwxXSwgb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFsyLDJdKSwgMikKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09NCksIlRlX2ludHJhIl08LXJlcChjKG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMywzXSwgb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09NSksIlR1X2ludHJhIl08LXJlcChjKG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMSwxXSwgb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFsyLDJdKSwgMikKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09NSksIlRlX2ludHJhIl08LXJlcChjKG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMywzXSwgb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKCmN4cl9wYXJhbV93MENbd2hpY2goY3hyX3BhcmFtX3cwQyRSZXBsaWNhdGU9PTEpLCJUdV9pbnRlciJdPC1jKG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMSwzXSwgb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFsyLDNdLG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMSw0XSwgb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFsyLDRdKQpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT0xKSwiVGVfaW50ZXIiXTwtYyhvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0sIG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMywyXSxvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMV0sIG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbNCwyXSkKCmN4cl9wYXJhbV93MENbd2hpY2goY3hyX3BhcmFtX3cwQyRSZXBsaWNhdGU9PTIpLCJUdV9pbnRlciJdPC1vYnMuUjJfQ2RfdzBfc3IxJGFscGhhX2ludGVyWzI6M10KY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09MiksIlRlX2ludGVyIl08LWMob2JzLlIyX0NkX3cwX3NyNF9pbnRlciRhbHBoYV9pbnRlciwgIG9icy5SMl9DZF93MF9zcjVfaW50ZXIkYWxwaGFfaW50ZXIpCgpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT0zKSwiVHVfaW50ZXIiXTwtYyhvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzEsM10sIG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMiwzXSxvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0sIG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09MyksIlRlX2ludGVyIl08LWMob2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFszLDFdLCBvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMl0sb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLCBvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0pCgpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT00KSwiVHVfaW50ZXIiXTwtYyhvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzEsM10sIG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMiwzXSxvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0sIG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09NCksIlRlX2ludGVyIl08LWMob2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFszLDFdLCBvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMl0sb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLCBvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0pCgpjeHJfcGFyYW1fdzBDW3doaWNoKGN4cl9wYXJhbV93MEMkUmVwbGljYXRlPT01KSwiVHVfaW50ZXIiXTwtYyhvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzEsM10sIG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMiwzXSxvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0sIG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX3cwQ1t3aGljaChjeHJfcGFyYW1fdzBDJFJlcGxpY2F0ZT09NSksIlRlX2ludGVyIl08LWMob2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFszLDFdLCBvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMl0sb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLCBvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0pCgoKY3hyX3BhcmFtX3cwQwoKIyMjIExvd2VyCgpjeHJfcGFyYW1fdzBDX2xvd2VyPC1leHBhbmQuZ3JpZChUdV9SZWdpbWU9YygiU1IxIiwgIlNSMiIpLCBUZV9SZWdpbWU9YygiU1I0IiwgIlNSNSIpLCBSZXBsaWNhdGU9YygxLDIsMyw0LDUpLCBFbnZpcm9ubWVudD1jKCJDZCIpKQpjeHJfcGFyYW1fdzBDX2xvd2VyJFR1X2xhbWJkYTwtMApjeHJfcGFyYW1fdzBDX2xvd2VyJFRlX2xhbWJkYTwtMApjeHJfcGFyYW1fdzBDX2xvd2VyJFR1X2ludHJhPC0wCmN4cl9wYXJhbV93MENfbG93ZXIkVGVfaW50cmE8LTAKY3hyX3BhcmFtX3cwQ19sb3dlciRUdV9pbnRlcjwtMApjeHJfcGFyYW1fdzBDX2xvd2VyJFRlX2ludGVyPC0wCgojcmVtb3ZpbmcgU1IyIGZvciByZXBsaWNhdGUgMgpjeHJfcGFyYW1fdzBDX2xvd2VyPC1jeHJfcGFyYW1fdzBDX2xvd2VyWy13aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09MiAmIGN4cl9wYXJhbV93MENfbG93ZXIkVHVfUmVnaW1lPT0iU1IyIiksXQoKCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9sYW1iZGEiXTwtcmVwKGMob2JzLlIxX0NkX3cwJGxhbWJkYVsxXS1vYnMuUjFfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzFdLCBvYnMuUjFfQ2RfdzAkbGFtYmRhWzJdLW9icy5SMV9DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMl0pLCAyKQpjeHJfcGFyYW1fdzBDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MENfbG93ZXIkUmVwbGljYXRlPT0xKSwiVGVfbGFtYmRhIl08LXJlcChjKG9icy5SMV9DZF93MCRsYW1iZGFbM10tb2JzLlIxX0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclszXSwgb2JzLlIxX0NkX3cwJGxhbWJkYVs0XS1vYnMuUjFfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09MiksIlR1X2xhbWJkYSJdPC1jKG9icy5SMl9DZF93MF9zcjEkbGFtYmRhLW9icy5SMl9DZF93MF9zcjEkbGFtYmRhX3N0YW5kYXJkX2Vycm9yKQpjeHJfcGFyYW1fdzBDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MENfbG93ZXIkUmVwbGljYXRlPT0yKSwiVGVfbGFtYmRhIl08LWMob2JzLlIyX0NkX3cwX3NyNCRsYW1iZGEtb2JzLlIyX0NkX3cwX3NyNCRsYW1iZGFfc3RhbmRhcmRfZXJyb3IsIG9icy5SMl9DZF93MF9zcjUkbGFtYmRhLW9icy5SMl9DZF93MF9zcjUkbGFtYmRhX3N0YW5kYXJkX2Vycm9yKQoKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09MyksIlR1X2xhbWJkYSJdPC1yZXAoYyhvYnMuUjNfQ2RfdzAkbGFtYmRhWzFdLW9icy5SM19DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMV0sIG9icy5SM19DZF93MCRsYW1iZGFbMl0tb2JzLlIzX0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclsyXSksIDIpCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTMpLCJUZV9sYW1iZGEiXTwtcmVwKGMob2JzLlIzX0NkX3cwJGxhbWJkYVszXS1vYnMuUjNfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzNdLCBvYnMuUjNfQ2RfdzAkbGFtYmRhWzRdLW9icy5SM19DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fdzBDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MENfbG93ZXIkUmVwbGljYXRlPT00KSwiVHVfbGFtYmRhIl08LXJlcChjKG9icy5SNF9DZF93MCRsYW1iZGFbMV0tb2JzLlI0X0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclsxXSwgb2JzLlI0X0NkX3cwJGxhbWJkYVsyXS1vYnMuUjRfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzJdKSwgMikKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09NCksIlRlX2xhbWJkYSJdPC1yZXAoYyhvYnMuUjRfQ2RfdzAkbGFtYmRhWzNdLW9icy5SNF9DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbM10sIG9icy5SNF9DZF93MCRsYW1iZGFbNF0tb2JzLlI0X0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvcls0XSksIGVhY2g9MikKCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTUpLCJUdV9sYW1iZGEiXTwtcmVwKGMob2JzLlI1X0NkX3cwJGxhbWJkYVsxXS1vYnMuUjVfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzFdLCBvYnMuUjVfQ2RfdzAkbGFtYmRhWzJdLW9icy5SNV9DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMl0pLCAyKQpjeHJfcGFyYW1fdzBDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MENfbG93ZXIkUmVwbGljYXRlPT01KSwiVGVfbGFtYmRhIl08LXJlcChjKG9icy5SNV9DZF93MCRsYW1iZGFbM10tb2JzLlI1X0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclszXSwgb2JzLlI1X0NkX3cwJGxhbWJkYVs0XS1vYnMuUjVfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzRdKSwgZWFjaD0yKQoKCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzEsMV0tb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzIsMl0tb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09MSksIlRlX2ludHJhIl08LXJlcChjKG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMywzXS1vYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsM10sIG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbNCw0XS1vYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fdzBDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MENfbG93ZXIkUmVwbGljYXRlPT0yKSwiVHVfaW50cmEiXTwtb2JzLlIyX0NkX3cwX3NyMSRhbHBoYV9pbnRyYS1vYnMuUjJfQ2RfdzBfc3IxJGFscGhhX2ludHJhX3N0YW5kYXJkX2Vycm9yCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRyYSJdPC1jKG9icy5SMl9DZF93MF9zcjQkYWxwaGFfaW50ZXItb2JzLlIyX0NkX3cwX3NyNCRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvciwgb2JzLlIyX0NkX3cwX3NyNSRhbHBoYV9pbnRlci1vYnMuUjJfQ2RfdzBfc3I1JGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yKQoKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09MyksIlR1X2ludHJhIl08LXJlcChjKG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMSwxXS1vYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMiwyXS1vYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fdzBDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MENfbG93ZXIkUmVwbGljYXRlPT0zKSwiVGVfaW50cmEiXTwtcmVwKGMob2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFszLDNdLW9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywzXSwgb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFs0LDRdLW9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTQpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzEsMV0tb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzIsMl0tb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09NCksIlRlX2ludHJhIl08LXJlcChjKG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMywzXS1vYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsM10sIG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbNCw0XS1vYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fdzBDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MENfbG93ZXIkUmVwbGljYXRlPT01KSwiVHVfaW50cmEiXTwtcmVwKGMob2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFsxLDFdLW9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFsyLDJdLW9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSksIDIpCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzMsM10tb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzQsNF0tb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9pbnRlciJdPC1jKG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMSwzXS1vYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMiwzXS1vYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFsxLDRdLW9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFsyLDRdLW9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09MSksIlRlX2ludGVyIl08LWMob2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFszLDFdLW9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFszLDJdLW9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMV0tb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0tb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09MiksIlR1X2ludGVyIl08LW9icy5SMl9DZF93MF9zcjEkYWxwaGFfaW50ZXJbMjozXS1vYnMuUjJfQ2RfdzBfc3IxJGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yWzI6M10KY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09MiksIlRlX2ludGVyIl08LWMob2JzLlIyX0NkX3cwX3NyNF9pbnRlciRhbHBoYV9pbnRlci1vYnMuUjJfQ2RfdzBfc3I0X2ludGVyJGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yLCBvYnMuUjJfQ2RfdzBfc3I1X2ludGVyJGFscGhhX2ludGVyLW9icy5SMl9DZF93MF9zcjVfaW50ZXIkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3IpCgpjeHJfcGFyYW1fdzBDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MENfbG93ZXIkUmVwbGljYXRlPT0zKSwiVHVfaW50ZXIiXTwtYyhvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzEsM10tb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzIsM10tb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMSw0XS1vYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMiw0XS1vYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRlciJdPC1jKG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMywxXS1vYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMywyXS1vYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLW9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFs0LDJdLW9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV93MENfbG93ZXJbd2hpY2goY3hyX3BhcmFtX3cwQ19sb3dlciRSZXBsaWNhdGU9PTQpLCJUdV9pbnRlciJdPC1jKG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMSwzXS1vYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMiwzXS1vYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFsxLDRdLW9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFsyLDRdLW9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09NCksIlRlX2ludGVyIl08LWMob2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFszLDFdLW9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFszLDJdLW9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMV0tb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0tb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX3cwQ19sb3dlclt3aGljaChjeHJfcGFyYW1fdzBDX2xvd2VyJFJlcGxpY2F0ZT09NSksIlR1X2ludGVyIl08LWMob2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFsxLDNdLW9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFsyLDNdLW9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0tb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzIsNF0tb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fdzBDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV93MENfbG93ZXIkUmVwbGljYXRlPT01KSwiVGVfaW50ZXIiXTwtYyhvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0tb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMl0tb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbNCwxXS1vYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbNCwyXS1vYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgojIyMgdXBwZXIKCmN4cl9wYXJhbV93MENfdXBwZXI8LWV4cGFuZC5ncmlkKFR1X1JlZ2ltZT1jKCJTUjEiLCAiU1IyIiksIFRlX1JlZ2ltZT1jKCJTUjQiLCAiU1I1IiksIFJlcGxpY2F0ZT1jKDEsMiwzLDQsNSksIEVudmlyb25tZW50PWMoIkNkIikpCmN4cl9wYXJhbV93MENfdXBwZXIkVHVfbGFtYmRhPC0wCmN4cl9wYXJhbV93MENfdXBwZXIkVGVfbGFtYmRhPC0wCmN4cl9wYXJhbV93MENfdXBwZXIkVHVfaW50cmE8LTAKY3hyX3BhcmFtX3cwQ191cHBlciRUZV9pbnRyYTwtMApjeHJfcGFyYW1fdzBDX3VwcGVyJFR1X2ludGVyPC0wCmN4cl9wYXJhbV93MENfdXBwZXIkVGVfaW50ZXI8LTAKCiNyZW1vdmluZyBTUjIgZm9yIHJlcGxpY2F0ZSAyCmN4cl9wYXJhbV93MENfdXBwZXI8LWN4cl9wYXJhbV93MENfdXBwZXJbLXdoaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT0yICYgY3hyX3BhcmFtX3cwQ191cHBlciRUdV9SZWdpbWU9PSJTUjIiKSxdCgoKY3hyX3BhcmFtX3cwQ191cHBlclt3aGljaChjeHJfcGFyYW1fdzBDX3VwcGVyJFJlcGxpY2F0ZT09MSksIlR1X2xhbWJkYSJdPC1yZXAoYyhvYnMuUjFfQ2RfdzAkbGFtYmRhWzFdK29icy5SMV9DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMV0sIG9icy5SMV9DZF93MCRsYW1iZGFbMl0rb2JzLlIxX0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclsyXSksIDIpCmN4cl9wYXJhbV93MENfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwQ191cHBlciRSZXBsaWNhdGU9PTEpLCJUZV9sYW1iZGEiXTwtcmVwKGMob2JzLlIxX0NkX3cwJGxhbWJkYVszXStvYnMuUjFfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzNdLCBvYnMuUjFfQ2RfdzAkbGFtYmRhWzRdK29icy5SMV9DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT0yKSwiVHVfbGFtYmRhIl08LWMob2JzLlIyX0NkX3cwX3NyMSRsYW1iZGErb2JzLlIyX0NkX3cwX3NyMSRsYW1iZGFfc3RhbmRhcmRfZXJyb3IpCmN4cl9wYXJhbV93MENfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwQ191cHBlciRSZXBsaWNhdGU9PTIpLCJUZV9sYW1iZGEiXTwtYyhvYnMuUjJfQ2RfdzBfc3I0JGxhbWJkYStvYnMuUjJfQ2RfdzBfc3I0JGxhbWJkYV9zdGFuZGFyZF9lcnJvciwgb2JzLlIyX0NkX3cwX3NyNSRsYW1iZGErb2JzLlIyX0NkX3cwX3NyNSRsYW1iZGFfc3RhbmRhcmRfZXJyb3IpCgpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT0zKSwiVHVfbGFtYmRhIl08LXJlcChjKG9icy5SM19DZF93MCRsYW1iZGFbMV0rb2JzLlIzX0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclsxXSwgb2JzLlIzX0NkX3cwJGxhbWJkYVsyXStvYnMuUjNfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzJdKSwgMikKY3hyX3BhcmFtX3cwQ191cHBlclt3aGljaChjeHJfcGFyYW1fdzBDX3VwcGVyJFJlcGxpY2F0ZT09MyksIlRlX2xhbWJkYSJdPC1yZXAoYyhvYnMuUjNfQ2RfdzAkbGFtYmRhWzNdK29icy5SM19DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbM10sIG9icy5SM19DZF93MCRsYW1iZGFbNF0rb2JzLlIzX0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvcls0XSksIGVhY2g9MikKCmN4cl9wYXJhbV93MENfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwQ191cHBlciRSZXBsaWNhdGU9PTQpLCJUdV9sYW1iZGEiXTwtcmVwKGMob2JzLlI0X0NkX3cwJGxhbWJkYVsxXStvYnMuUjRfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzFdLCBvYnMuUjRfQ2RfdzAkbGFtYmRhWzJdK29icy5SNF9DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMl0pLCAyKQpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT00KSwiVGVfbGFtYmRhIl08LXJlcChjKG9icy5SNF9DZF93MCRsYW1iZGFbM10rb2JzLlI0X0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclszXSwgb2JzLlI0X0NkX3cwJGxhbWJkYVs0XStvYnMuUjRfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwQ191cHBlclt3aGljaChjeHJfcGFyYW1fdzBDX3VwcGVyJFJlcGxpY2F0ZT09NSksIlR1X2xhbWJkYSJdPC1yZXAoYyhvYnMuUjVfQ2RfdzAkbGFtYmRhWzFdK29icy5SNV9DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbMV0sIG9icy5SNV9DZF93MCRsYW1iZGFbMl0rb2JzLlI1X0NkX3cwJGxhbWJkYV9zdGFuZGFyZF9lcnJvclsyXSksIDIpCmN4cl9wYXJhbV93MENfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwQ191cHBlciRSZXBsaWNhdGU9PTUpLCJUZV9sYW1iZGEiXTwtcmVwKGMob2JzLlI1X0NkX3cwJGxhbWJkYVszXStvYnMuUjVfQ2RfdzAkbGFtYmRhX3N0YW5kYXJkX2Vycm9yWzNdLCBvYnMuUjVfQ2RfdzAkbGFtYmRhWzRdK29icy5SNV9DZF93MCRsYW1iZGFfc3RhbmRhcmRfZXJyb3JbNF0pLCBlYWNoPTIpCgoKY3hyX3BhcmFtX3cwQ191cHBlclt3aGljaChjeHJfcGFyYW1fdzBDX3VwcGVyJFJlcGxpY2F0ZT09MSksIlR1X2ludHJhIl08LXJlcChjKG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMSwxXStvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMiwyXStvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMob2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFszLDNdK29icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywzXSwgb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFs0LDRdK29icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV93MENfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwQ191cHBlciRSZXBsaWNhdGU9PTIpLCJUdV9pbnRyYSJdPC1vYnMuUjJfQ2RfdzBfc3IxJGFscGhhX2ludHJhICsgb2JzLlIyX0NkX3cwX3NyMSRhbHBoYV9pbnRyYV9zdGFuZGFyZF9lcnJvcgpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT0yKSwiVGVfaW50cmEiXTwtYyhvYnMuUjJfQ2RfdzBfc3I0JGFscGhhX2ludGVyK29icy5SMl9DZF93MF9zcjQkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3IsIG9icy5SMl9DZF93MF9zcjUkYWxwaGFfaW50ZXIrb2JzLlIyX0NkX3cwX3NyNSRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvcikKCgpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT0zKSwiVHVfaW50cmEiXTwtcmVwKGMob2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFsxLDFdK29icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFsyLDJdK29icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSksIDIpCmN4cl9wYXJhbV93MENfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRyYSJdPC1yZXAoYyhvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzMsM10rb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzQsNF0rb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX3cwQ191cHBlclt3aGljaChjeHJfcGFyYW1fdzBDX3VwcGVyJFJlcGxpY2F0ZT09NCksIlR1X2ludHJhIl08LXJlcChjKG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMSwxXStvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMiwyXStvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT00KSwiVGVfaW50cmEiXTwtcmVwKGMob2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFszLDNdK29icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywzXSwgb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFs0LDRdK29icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV93MENfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwQ191cHBlciRSZXBsaWNhdGU9PTUpLCJUdV9pbnRyYSJdPC1yZXAoYyhvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzEsMV0rb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzIsMl0rb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX3cwQ191cHBlclt3aGljaChjeHJfcGFyYW1fdzBDX3VwcGVyJFJlcGxpY2F0ZT09NSksIlRlX2ludHJhIl08LXJlcChjKG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMywzXStvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsM10sIG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbNCw0XStvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsNF0pLCBlYWNoPTIpCgoKY3hyX3BhcmFtX3cwQ191cHBlclt3aGljaChjeHJfcGFyYW1fdzBDX3VwcGVyJFJlcGxpY2F0ZT09MSksIlR1X2ludGVyIl08LWMob2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFsxLDNdK29icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeFsyLDNdK29icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0rb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzIsNF0rb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT0xKSwiVGVfaW50ZXIiXTwtYyhvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0rb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMl0rb2JzLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbNCwxXStvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIG9icy5SMV9DZF93MCRhbHBoYV9tYXRyaXhbNCwyXStvYnMuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT0yKSwiVHVfaW50ZXIiXTwtb2JzLlIyX0NkX3cwX3NyMSRhbHBoYV9pbnRlclsyOjNdK29icy5SMl9DZF93MF9zcjEkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMjozXQpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT0yKSwiVGVfaW50ZXIiXTwtYyhvYnMuUjJfQ2RfdzBfc3I0X2ludGVyJGFscGhhX2ludGVyK29icy5SMl9DZF93MF9zcjRfaW50ZXIkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3IsIG9icy5SMl9DZF93MF9zcjVfaW50ZXIkYWxwaGFfaW50ZXIrb2JzLlIyX0NkX3cwX3NyNV9pbnRlciRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvcikKCmN4cl9wYXJhbV93MENfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUdV9pbnRlciJdPC1jKG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMSwzXStvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIG9icy5SM19DZF93MCRhbHBoYV9tYXRyaXhbMiwzXStvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFsxLDRdK29icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFsyLDRdK29icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX3cwQ191cHBlclt3aGljaChjeHJfcGFyYW1fdzBDX3VwcGVyJFJlcGxpY2F0ZT09MyksIlRlX2ludGVyIl08LWMob2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFszLDFdK29icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeFszLDJdK29icy5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMV0rb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBvYnMuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0rb2JzLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX3cwQ191cHBlclt3aGljaChjeHJfcGFyYW1fdzBDX3VwcGVyJFJlcGxpY2F0ZT09NCksIlR1X2ludGVyIl08LWMob2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFsxLDNdK29icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeFsyLDNdK29icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0rb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzIsNF0rb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT00KSwiVGVfaW50ZXIiXTwtYyhvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0rb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMl0rb2JzLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbNCwxXStvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIG9icy5SNF9DZF93MCRhbHBoYV9tYXRyaXhbNCwyXStvYnMuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fdzBDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV93MENfdXBwZXIkUmVwbGljYXRlPT01KSwiVHVfaW50ZXIiXTwtYyhvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzEsM10rb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzIsM10rb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMSw0XStvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMiw0XStvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV93MENfdXBwZXJbd2hpY2goY3hyX3BhcmFtX3cwQ191cHBlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRlciJdPC1jKG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMywxXStvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIG9icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMywyXStvYnMuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFs0LDFdK29icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgb2JzLlI1X0NkX3cwJGFscGhhX21hdHJpeFs0LDJdK29icy5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCgpgYGAKCiMjIyMjIGpvaW5pbmcgZGF0YSBmcmFtZQoKYGBge3J9CnBhcmFtX2FsbF93MDwtYXMuZGF0YS5mcmFtZShyYmluZChjeHJfcGFyYW1fdzAsIGN4cl9wYXJhbV93MEMpKQoKcGFyYW1fYWxsX3cwX2xvd2VyPC1hcy5kYXRhLmZyYW1lKHJiaW5kKGN4cl9wYXJhbV93MF9sb3dlciwgY3hyX3BhcmFtX3cwQ19sb3dlcikpCnBhcmFtX2FsbF93MF91cHBlcjwtYXMuZGF0YS5mcmFtZShyYmluZChjeHJfcGFyYW1fdzBfdXBwZXIsIGN4cl9wYXJhbV93MENfdXBwZXIpKQoKCnBhcmFtX2FsbF93MF9sb3dlcgpwYXJhbV9hbGxfdzBfdXBwZXIKCndyaXRlLmNzdihwYXJhbV9hbGxfdzAsICIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1ldGVyc19jeHJfbm9ybWFsLmNzdiIpCndyaXRlLmNzdihwYXJhbV9hbGxfdzBfdXBwZXIsICIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1ldGVyc19jeHJfbm9ybWFsX3VwcGVyLmNzdiIpCndyaXRlLmNzdihwYXJhbV9hbGxfdzBfbG93ZXIsICIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1ldGVyc19jeHJfbm9ybWFsX2xvd2VyLmNzdiIpCmBgYAoKIyMjIyBJbXBvcnRpbmcgcGFyYW1ldGVycwoKYGBge3J9CnBhcmFtX2FsbF93MDwtcmVhZC5jc3YoIi4vTmV3QW5hbHlzZXMvY3hyX25vcm1hbC9wYXJhbWV0ZXJzX2N4cl9ub3JtYWwuY3N2IikKcGFyYW1fYWxsX3cwX3VwcGVyPC1yZWFkLmNzdigiLi9OZXdBbmFseXNlcy9jeHJfbm9ybWFsL3BhcmFtZXRlcnNfY3hyX25vcm1hbF91cHBlci5jc3YiKQpwYXJhbV9hbGxfdzBfbG93ZXI8LXJlYWQuY3N2KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1ldGVyc19jeHJfbm9ybWFsX2xvd2VyLmNzdiIpCgpwYXJhbV9hbGxfdzA8LXBhcmFtX2FsbF93MFssLTFdCnBhcmFtX2FsbF93MF91cHBlcjwtcGFyYW1fYWxsX3cwX3VwcGVyWywtMV0KcGFyYW1fYWxsX3cwX2xvd2VyPC1wYXJhbV9hbGxfdzBfbG93ZXJbLC0xXQoKc3RyKHBhcmFtX2FsbF93MCkKc3RyKHBhcmFtX2FsbF93MF91cHBlcikKc3RyKHBhcmFtX2FsbF93MF9sb3dlcikKYGBgCgoKIyMjIyMgUGxvdHRpbmcgZGF0YQoKYGBge3J9CgpwYXJhbV9hbGxfdzBfbG9uZzwtZ2F0aGVyKHBhcmFtX2FsbF93MCwgcGFyYW1ldGVyLCB2YWx1ZSxUdV9sYW1iZGE6VGVfaW50ZXIgKQoKcGFyYW1fYWxsX3cwX2xvbmckY2F0ZWdvcnk8LW1hcHZhbHVlcyhwYXJhbV9hbGxfdzBfbG9uZyRwYXJhbWV0ZXIsIGMoIlR1X2xhbWJkYSIsICJUZV9sYW1iZGEiLCAiVHVfaW50cmEiLCAiVGVfaW50cmEiLCJUdV9pbnRlciIsICJUZV9pbnRlciIpLCBjKCJsYW1iZGEiLCAibGFtYmRhIiwgImludHJhIiwgImludHJhIiwgImludGVyIiwgImludGVyIikpCgpwYXJhbV9hbGxfdzBfbG93ZXJfbG9uZzwtZ2F0aGVyKHBhcmFtX2FsbF93MF9sb3dlciwgcGFyYW1ldGVyLCB2YWx1ZSxUdV9sYW1iZGE6VGVfaW50ZXIgKQoKcGFyYW1fYWxsX3cwX2xvd2VyX2xvbmckY2F0ZWdvcnk8LW1hcHZhbHVlcyhwYXJhbV9hbGxfdzBfbG93ZXJfbG9uZyRwYXJhbWV0ZXIsIGMoIlR1X2xhbWJkYSIsICJUZV9sYW1iZGEiLCAiVHVfaW50cmEiLCAiVGVfaW50cmEiLCJUdV9pbnRlciIsICJUZV9pbnRlciIpLCBjKCJsYW1iZGEiLCAibGFtYmRhIiwgImludHJhIiwgImludHJhIiwgImludGVyIiwgImludGVyIikpCgpwYXJhbV9hbGxfdzBfdXBwZXJfbG9uZzwtZ2F0aGVyKHBhcmFtX2FsbF93MF91cHBlciwgcGFyYW1ldGVyLCB2YWx1ZSxUdV9sYW1iZGE6VGVfaW50ZXIgKQoKcGFyYW1fYWxsX3cwX3VwcGVyX2xvbmckY2F0ZWdvcnk8LW1hcHZhbHVlcyhwYXJhbV9hbGxfdzBfdXBwZXJfbG9uZyRwYXJhbWV0ZXIsIGMoIlR1X2xhbWJkYSIsICJUZV9sYW1iZGEiLCAiVHVfaW50cmEiLCAiVGVfaW50cmEiLCJUdV9pbnRlciIsICJUZV9pbnRlciIpLCBjKCJsYW1iZGEiLCAibGFtYmRhIiwgImludHJhIiwgImludHJhIiwgImludGVyIiwgImludGVyIikpCgpjb2xuYW1lcyhwYXJhbV9hbGxfdzBfbG93ZXJfbG9uZylbNl08LSJsb3dlciIKY29sbmFtZXMocGFyYW1fYWxsX3cwX3VwcGVyX2xvbmcpWzZdPC0idXBwZXIiCgpzdHIocGFyYW1fYWxsX3cwX2xvbmcpCgpwYXJhbV9hbGxfdzBfbG9uZzwtY2JpbmQocGFyYW1fYWxsX3cwX2xvbmdbLDE6N10scGFyYW1fYWxsX3cwX2xvd2VyX2xvbmckbG93ZXIsIHBhcmFtX2FsbF93MF91cHBlcl9sb25nJHVwcGVyKQoKY29sbmFtZXMocGFyYW1fYWxsX3cwX2xvbmcpWzg6OV08LWMoImxvd2VyIiwidXBwZXIiKQoKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlRlX2ludHJhIiAmIFR1X1JlZ2ltZT09IlNSMSIpLCBhZXMoeD1UZV9SZWdpbWUsIHk9dmFsdWUsIGZpbGw9RW52aXJvbm1lbnQpKSsKICBnZW9tX2JveHBsb3QoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBvdXRsaWVyLmFscGhhID0gOTkpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiRXZvbHZlZCBcbndpdGhvdXQgY2FkbWl1bSIsICJFdm9sdmVkIFxud2l0aCBjYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRDU1RTAwIiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIldhdGVyIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiI0Q1NUUwMCIsICIjMDA5RTczIiksIGxhYmVscz1jKCJXYXRlciIsICJDYWRtaXVtIikpKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIGV2YW5zaSkiKSsKICB4bGFiKCJTZWxlY3Rpb24gcmVnaW1lIikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1fUktfaW50cmFUZV93MF9yZXAucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludHJhIiAmIFRlX1JlZ2ltZT09IlNSNCIpLCBhZXMoeD1UdV9SZWdpbWUsIHk9dmFsdWUsIGZpbGw9RW52aXJvbm1lbnQpKSsKICBnZW9tX2JveHBsb3QocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIG91dGxpZXIuYWxwaGEgPSA5OSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiRXZvbHZlZCBcbndpdGhvdXQgY2FkbWl1bSIsICJFdm9sdmVkIFxud2l0aCBjYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRDU1RTAwIiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIldhdGVyIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiI0Q1NUUwMCIsICIjMDA5RTczIiksIGxhYmVscz1jKCJXYXRlciIsICJDYWRtaXVtIikpKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIHVydGljYWUpIikrCiAgeGxhYigiU2VsZWN0aW9uIHJlZ2ltZSIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbm9ybWFsL3BhcmFtX1JLX2ludHJhVHVfdzBfcmVwLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgoKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlRlX2ludHJhIiAmIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09IkNkIiksIGFlcyh4PVRlX1JlZ2ltZSwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBnZW9tX2JveHBsb3QocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIG91dGxpZXIuYWxwaGEgPSA5OSkrCiAgZ2VvbV9wb2ludChhbHBoYT0wLjg1LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0Q1NUUwMCIsICIjMDA5RTczIikpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkV2b2x2ZWQgXG53aXRob3V0IGNhZG1pdW0iLCAiRXZvbHZlZCBcbndpdGggY2FkbWl1bSIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiU2VsZWN0aW9uIHJlZ2ltZSIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbm9ybWFsL3BhcmFtX1JLX2ludHJhVGVfdzBfcmVwX2V2b2wucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludHJhIiAmIFRlX1JlZ2ltZT09IlNSNCIgJiBFbnZpcm9ubWVudD09IkNkIiksIGFlcyh4PVR1X1JlZ2ltZSwgeT12YWx1ZSwgZmlsbD1UdV9SZWdpbWUpKSsKICBnZW9tX2JveHBsb3QoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBvdXRsaWVyLmFscGhhID0gOTkpKwogIGdlb21fcG9pbnQoYWxwaGE9MC44NSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiRXZvbHZlZCBcbndpdGhvdXQgY2FkbWl1bSIsICJFdm9sdmVkIFxud2l0aCBjYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRDU1RTAwIiwgIiMwMDlFNzMiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiI0Q1NUUwMCIsICIjMDA5RTczIiksIGxhYmVscz1jKCJXYXRlciIsICJDYWRtaXVtIikpKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIHVydGljYWUpIikrCiAgeGxhYigiU2VsZWN0aW9uIHJlZ2ltZSIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbm9ybWFsL3BhcmFtX1JLX2ludHJhVHVfdzBfcmVwX2V2b2wucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF93MF9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRyYSIgJiBUdV9SZWdpbWU9PSJTUjEiKSwgYWVzKHg9RW52aXJvbm1lbnQsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX25vcm1hbC9wYXJhbV9SS19pbnRyYVRlX3cwX3JlcF9lbnYucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludHJhIiAmIFRlX1JlZ2ltZT09IlNSNCIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9RW52aXJvbm1lbnQpKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkhvbW9nZW5lb3VzIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1fUktfaW50cmFUdV93MF9yZXBfZW52LnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfdzBfbG9uZywgcGFyYW1ldGVyPT0iVGVfaW50ZXIiKSwgYWVzKHg9RW52aXJvbm1lbnQsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZmFjZXRfZ3JpZChUdV9SZWdpbWV+LiwgbGFiZWxsZXI9bGFiZWxsZXIoVHVfUmVnaW1lPXJlZ2ltZVR1LCBUZV9SZWdpbWU9cmVnaW1lVGUpKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXI9ImRhcmtncmF5IikrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICB5bGFiKCJJbnRlcnNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX25vcm1hbC9wYXJhbV9SS19pbnRlclRlX3cwX3JlcF9lbnYucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludGVyIiksIGFlcyhmaWxsPVR1X1JlZ2ltZSwgeT12YWx1ZSwgeD1FbnZpcm9ubWVudCkpKwogIGZhY2V0X2dyaWQoVGVfUmVnaW1lfi4sIGxhYmVsbGVyPWxhYmVsbGVyKFR1X1JlZ2ltZT1yZWdpbWVUdSwgVGVfUmVnaW1lPXJlZ2ltZVRlKSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyPSJkYXJrZ3JheSIpKwogIGdlb21fYm94cGxvdChvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNzUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksbGFiZWxzPWMoIkNvbnRyb2wiLCAiSG9tb2dlbmVvdXMiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkhvbW9nZW5lb3VzIikpKwogIHlsYWIoIkludGVyc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIHVydGljYWUpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX25vcm1hbC9wYXJhbV9SS19pbnRlclR1X3cwX3JlcF9lbnYucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF93MF9sb25nLCBwYXJhbWV0ZXI9PSJUZV9sYW1iZGEiICYgVHVfUmVnaW1lPT0iU1IxIiksIGFlcyh4PUVudmlyb25tZW50LCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkhvbW9nZW5lb3VzIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkhvbW9nZW5lb3VzIikpKwogIHlsYWIoIkludHJpbnNpYyBncm93dGggcmF0ZSAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1fUktfbGFtYmRhVGVfdzBfcmVwX2Vudi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfdzBfbG9uZywgcGFyYW1ldGVyPT0iVHVfbGFtYmRhIiAmIFRlX1JlZ2ltZT09IlNSNCIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9RW52aXJvbm1lbnQpKSsKICBnZW9tX2JveHBsb3QocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIG91dGxpZXIuYWxwaGEgPTAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksbGFiZWxzPWMoIkNvbnRyb2wiLCAiSG9tb2dlbmVvdXMiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkhvbW9nZW5lb3VzIikpKwogIHlsYWIoIkludHJpbnNpYyBncm93dGggcmF0ZSAoVC4gdXJ0aWNhZSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbm9ybWFsL3BhcmFtX1JLX2xhbWJkYVR1X3cwX3JlcF9lbnYucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCgojIyMjIyMjIyMjIwoKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlRlX2ludHJhIiAmIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09IkNkIiksIGFlcyh4PUVudmlyb25tZW50LCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIGV2YW5zaSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpKwogIHlsaW0oYygwLjAzLDAuMjcpKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX25vcm1hbC9wYXJhbV9SS19pbnRyYVRlX3cwX3JlcF9DRC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfdzBfbG9uZywgcGFyYW1ldGVyPT0iVGVfaW50cmEiICYgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIpLCBhZXMoeD1FbnZpcm9ubWVudCwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKSsKICB5bGltKGMoMC4wMywwLjI3KSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1fUktfaW50cmFUZV93MF9yZXBfTi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfdzBfbG9uZywgcGFyYW1ldGVyPT0iVHVfaW50cmEiICYgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iQ2QiKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PUVudmlyb25tZW50KSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSxsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIHVydGljYWUpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKSsKICB5bGltKGMoMC4wMywwLjI3KSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1fUktfaW50cmFUdV93MF9yZXBfQ0QucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludHJhIiAmIFRlX1JlZ2ltZT09IlNSNCIgJiBFbnZpcm9ubWVudD09Ik4iKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PUVudmlyb25tZW50KSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSxsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIHVydGljYWUpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKSsKICB5bGltKGMoMC4wMywwLjI3KSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1fUktfaW50cmFUdV93MF9yZXBfTi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlRlX2ludGVyIiAmIEVudmlyb25tZW50PT0iQ2QiKSwgYWVzKHg9RW52aXJvbm1lbnQsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZmFjZXRfZ3JpZCguflR1X1JlZ2ltZSwgbGFiZWxsZXI9bGFiZWxsZXIoVHVfUmVnaW1lPXJlZ2ltZVR1LCBUZV9SZWdpbWU9cmVnaW1lVGUpKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXI9ImRhcmtncmF5IikrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50ZXJzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikrCiAgeWxpbShjKC0wLjA1LCAwLjE2KSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1fUktfaW50ZXJUZV93MF9yZXBfQ2QucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlRlX2ludGVyIiAmIEVudmlyb25tZW50PT0iTiIpLCBhZXMoeD1FbnZpcm9ubWVudCwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBmYWNldF9ncmlkKC5+VHVfUmVnaW1lLCBsYWJlbGxlcj1sYWJlbGxlcihUdV9SZWdpbWU9cmVnaW1lVHUsIFRlX1JlZ2ltZT1yZWdpbWVUZSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91cj0iZGFya2dyYXkiKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRlcnNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKSsKICB5bGltKGMoLTAuMDUsIDAuMTYpKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX25vcm1hbC9wYXJhbV9SS19pbnRlclRlX3cwX3JlcF9OLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF93MF9sb25nLCBwYXJhbWV0ZXI9PSJUdV9pbnRlciIgJiBFbnZpcm9ubWVudD09IkNkIiksIGFlcyhmaWxsPVR1X1JlZ2ltZSwgeT12YWx1ZSwgeD1FbnZpcm9ubWVudCkpKwogIGZhY2V0X2dyaWQoLn5UZV9SZWdpbWUsIGxhYmVsbGVyPWxhYmVsbGVyKFR1X1JlZ2ltZT1yZWdpbWVUdSwgVGVfUmVnaW1lPXJlZ2ltZVRlKSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyPSJkYXJrZ3JheSIpKwogIGdlb21fYm94cGxvdChvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNzUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRlcnNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikrCiAgeWxpbShjKC0wLjA1LCAwLjEyKSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1fUktfaW50ZXJUdV93MF9yZXBfQ2QucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludGVyIiAmIEVudmlyb25tZW50PT0iTiIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9RW52aXJvbm1lbnQpKSsKICBmYWNldF9ncmlkKC5+VGVfUmVnaW1lLCBsYWJlbGxlcj1sYWJlbGxlcihUdV9SZWdpbWU9cmVnaW1lVHUsIFRlX1JlZ2ltZT1yZWdpbWVUZSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91cj0iZGFya2dyYXkiKSsKICBnZW9tX2JveHBsb3Qob3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjc1KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50ZXJzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gdXJ0aWNhZSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpKwogIHlsaW0oYygtMC4wNSwgMC4xMikpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbm9ybWFsL3BhcmFtX1JLX2ludGVyVHVfdzBfcmVwX04ucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF93MF9sb25nLCBwYXJhbWV0ZXI9PSJUZV9sYW1iZGEiICYgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iQ2QiKSwgYWVzKHg9RW52aXJvbm1lbnQsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyaW5zaWMgZ3Jvd3RoIHJhdGUgKFQuIGV2YW5zaSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpKwogIHlsaW0oYygwLCAzKSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcGFyYW1fUktfbGFtYmRhVGVfdzBfcmVwX0NELnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF93MF9sb25nLCBwYXJhbWV0ZXI9PSJUZV9sYW1iZGEiICYgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIpLCBhZXMoeD1FbnZpcm9ubWVudCwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmluc2ljIGdyb3d0aCByYXRlIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKSsKICB5bGltKGMoMCwgOCkpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbm9ybWFsL3BhcmFtX1JLX2xhbWJkYVRlX3cwX3JlcF9OLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF93MF9sb25nLCBwYXJhbWV0ZXI9PSJUdV9sYW1iZGEiICYgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iQ2QiKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PUVudmlyb25tZW50KSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YyggIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmluc2ljIGdyb3d0aCByYXRlIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikrCiAgeWxpbShjKDAsIDMpKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX25vcm1hbC9wYXJhbV9SS19sYW1iZGFUdV93MF9yZXBfQ0QucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX3cwX2xvbmcsIHBhcmFtZXRlcj09IlR1X2xhbWJkYSIgJiBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJOIiksIGFlcyhmaWxsPVR1X1JlZ2ltZSwgeT12YWx1ZSwgeD1FbnZpcm9ubWVudCkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmluc2ljIGdyb3d0aCByYXRlIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikrCiAgeWxpbShjKDAsIDgpKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX25vcm1hbC9wYXJhbV9SS19sYW1iZGFUdV93MF9yZXBfTi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKCmBgYAoKIyMjIyBQcmVkaWN0aW5nIGRlbnNpdGllcwoKYGBge3J9CgpkZW5zaXR5X2F1eDwtc2VxKDAsIDEwLCBieT0oMTAvMTAwKSkKCnByZWRfZGZfY3hyPC1hcy5kYXRhLmZyYW1lKGV4cGFuZF9ncmlkKERlbnNpdHk9ZGVuc2l0eV9hdXgsIFR1X1JlZ2ltZT1jKCJTUjEiLCJTUjIiKSwgVGVfUmVnaW1lPWMoIlNSNCIsIlNSNSIpLCBSZXBsaWNhdGU9YygxOjUpLCBFbnZpcm9ubWVudD1jKCJOIiwgIkNkIikpKQoKcHJlZF9kZl9jeHIkVHVfbWVhbl9pbnRyYTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX3cwLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfdzAsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHIkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9jeHIkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHIkVHVfbWVhbl9pbnRlcjwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX3cwLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfdzAsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHIkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfY3hyJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCgpwcmVkX2RmX2N4ciRUdV9pbnRyYV9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4clssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfdzBfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHIkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4ciRSZXBsaWNhdGVbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF93MF9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUdV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX3cwX2xvd2VyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUdV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaSpwcmVkX2RmX2N4ciREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX2N4ciRUdV9pbnRlcl9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4clssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfdzBfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHIkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4ciRSZXBsaWNhdGVbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF93MF9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUdV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX3cwX2xvd2VyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUdV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9jeHIkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHIkVHVfaW50cmFfVTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX3cwX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfdzBfdXBwZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHIkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF93MF91cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9jeHIkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHIkVHVfaW50ZXJfVTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX3cwX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfdzBfdXBwZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHIkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF93MF91cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfY3hyJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfY3hyJFRlX21lYW5faW50cmE8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfY3hyWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVGVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX3cwLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHIkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4ciRSZXBsaWNhdGVbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfdzAsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHIkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4ciRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfY3hyJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfY3hyJFRlX21lYW5faW50ZXI8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfY3hyWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVGVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX3cwLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHIkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4ciRSZXBsaWNhdGVbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfdzAsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHIkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4ciRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipwcmVkX2RmX2N4ciREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX2N4ciRUZV9pbnRyYV9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4clssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfdzBfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHIkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4ciRSZXBsaWNhdGVbeF0pJFRlX2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF93MF9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX3cwX2xvd2VyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaSpwcmVkX2RmX2N4ciREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX2N4ciRUZV9pbnRlcl9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4clssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfdzBfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHIkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4ciRSZXBsaWNhdGVbeF0pJFRlX2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF93MF9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX3cwX2xvd2VyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9jeHIkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHIkVGVfaW50cmFfVTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX3cwX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfdzBfdXBwZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHIkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF93MF91cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVGVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9jeHIkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHIkVGVfaW50ZXJfVTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX3cwX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHIkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHIkUmVwbGljYXRlW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfdzBfdXBwZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4ciRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHIkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF93MF91cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4ciRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyJFJlcGxpY2F0ZVt4XSkkVGVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfY3hyJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCiMgUmVtb3ZpbmcgVHUgZXZvbHZlZCByZXBsaWNhdGUgMiBiZWNhdXNlIHRoZXJlIGlzIG5vIGRhdGEKcHJlZF9kZl9jeHI8LXByZWRfZGZfY3hyWy13aGljaChwcmVkX2RmX2N4ciRUdV9SZWdpbWU9PSJTUjIiICYgcHJlZF9kZl9jeHIkUmVwbGljYXRlPT0yKSxdCgoKCiMgVHJhbnNmb3JtaW5nIGV2ZXJ5dGhpbmcgYmVsbG93IDAgaW50byAwIGZvciB0aGUgbG93ZXIgaW50ZXJ2YWwKCnByZWRfZGZfY3hyJFRlX2ludGVyX0xbd2hpY2gocHJlZF9kZl9jeHIkVGVfaW50ZXJfTDwwKV08LTAKcHJlZF9kZl9jeHIkVGVfaW50cmFfTFt3aGljaChwcmVkX2RmX2N4ciRUZV9pbnRyYV9MPDApXTwtMApwcmVkX2RmX2N4ciRUdV9pbnRlcl9MW3doaWNoKHByZWRfZGZfY3hyJFR1X2ludGVyX0w8MCldPC0wCnByZWRfZGZfY3hyJFR1X2ludHJhX0xbd2hpY2gocHJlZF9kZl9jeHIkVHVfaW50cmFfTDwwKV08LTAKCgpgYGAKCmBgYHtyfQpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIFQuIHVydGljYWUiKSsKICBnZ3RpdGxlKCJUdSBjb250cm9sIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCmBgYAoKCiMjIyMgUGxvdHRpbmcgcHJlZGljdGlvbnMKCiMjIyMjIENPTlRST0wgSU5UUkEKCmBgYHtyfQpjYSRSZXBsaWNhdGU8LWFzLmNoYXJhY3RlcihjYSRSZXApCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLTEsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIlR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcHJlZF9UdV9JTlRSQV9Db250cm9sX3dhdGVyLnBkZiIsIHdpZHRoPTI1LCBoZWlnaHQ9MTApCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJDIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludHJhX0wsIHltYXg9VHVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTEgJiBFbnZpcm9ubWVudD09IkMiICksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0xICYgRW52PT0iQ2QiICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMtMSwgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIFQuIHVydGljYWUiKSsKICBnZ3RpdGxlKCJUdSBjb250cm9sIGludHJhc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbm9ybWFsL3ByZWRfVHVfSU5UUkFfQ29udHJvbF9jYWRtaXVtLnBkZiIsIHdpZHRoPTI1LCBoZWlnaHQ9MTApCgojc3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTEgJiBFbnZpcm9ubWVudD09IkMiICYgUmVwbGljYXRlPT0zKQoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRyYV9MLCB5bWF4PVRlX2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NCAmIEVudj09Ik4iICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMtMSwgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIFQuIGV2YW5zaSIpKwogIGdndGl0bGUoIlRlIGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9ub3JtYWwvcHJlZF9UZV9JTlRSQV9Db250cm9sX2NvbnRyb2wucGRmIiwgd2lkdGg9MjUsIGhlaWdodD0xMCkKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRyYV9MLCB5bWF4PVRlX2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJDIiApLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NCAmIEVudj09IkNkIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLTEsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogICAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiBULiBldmFuc2kiKSsKICBnZ3RpdGxlKCJUZSBjb250cm9sIGludHJhc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbm9ybWFsL3ByZWRfVGVfSU5UUkFfQ29udHJvbF9jYWRtaXVtLnBkZiIsIHdpZHRoPTI1LCBoZWlnaHQ9MTApCgpgYGAKCiMjIyMjIENPTlRST0wgSU5URVIgdnMgY29udHJvbAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTEgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT00KSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09NCksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0xICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgJiBUZSBjb250cm9sIGludGVyc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTEgJiBFbnZpcm9ubWVudD09IkMiICYgVGVfUmVnaW1lPT00KSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJDIiAmIFRlX1JlZ2ltZT09NCksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0xICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09NCksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlR1ICYgVGUgY29udHJvbCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUZV9SZWdpbWU9PTQgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0xKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09MSksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT00ICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0xKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgICYgVHUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICAgIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUZV9SZWdpbWU9PTQgJiBFbnZpcm9ubWVudD09IkMiICYgVHVfUmVnaW1lPT0xKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJDIiAmIFR1X1JlZ2ltZT09MSksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT00ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlICYgVHUgY29udHJvbCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKYGBgCgojIyMjIyBDT05UUk9MIElOVEVSIHZzIGV2b2x2ZWQKCmBgYHtyfQpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09NSksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50ZXJfTCwgeW1heD1UdV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFR1X1JlZ2ltZT09MSAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PTUpLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MSAmIEVudj09Ik4iICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09NSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlR1IGNvbnRyb2wgJiBUZSBldm9sdmVkIGludGVyc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTEgJiBFbnZpcm9ubWVudD09IkMiICYgVGVfUmVnaW1lPT01KSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJDIiAmIFRlX1JlZ2ltZT09NSksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0xICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09NSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlR1IGNvbnRyb2wgJiBUZSBldm9sdmVkIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iTiIgJiBUdV9SZWdpbWU9PTIpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUZV9SZWdpbWU9PTQgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0yKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUZSBjb250cm9sICAmIFR1IGV2b2x2ZWQgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJDIiAmIFR1X1JlZ2ltZT09MiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iQyIgJiBUdV9SZWdpbWU9PTIpLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NCAmIEVudj09IkNkIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUZSBjb250cm9sICAmIFR1IGV2b2x2ZWQgaW50ZXJzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCmBgYAoKIyMjIyMgQ09OVFJPTCBJTlRSQSBldm9sdmVkCgpgYGB7cn0KY2EkUmVwbGljYXRlPC1hcy5jaGFyYWN0ZXIoY2EkUmVwKQoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0yICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MiAmIEVudj09Ik4iICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlR1IGV2b2x2ZWQgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTIgJiBFbnZpcm9ubWVudD09IkMiICksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50cmFfTCwgeW1heD1UdV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCBpbnRyYXNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFRlX1JlZ2ltZT09NSAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRyYV9MLCB5bWF4PVRlX2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT01ICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NSAmIEVudj09Ik4iICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFRlX1JlZ2ltZT09NSAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRyYV9MLCB5bWF4PVRlX2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT01ICYgRW52aXJvbm1lbnQ9PSJDIiApLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NSAmIEVudj09IkNkIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUZSBldm9sdmVkIGludHJhc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCiMjIyMjIEV2b2x2ZWQgSU5URVIgdnMgY29udHJvbAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTIgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT00KSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0yICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09NCksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0yICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCAmIFRlIGNvbnRyb2wgaW50ZXJzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iQyIgJiBUZV9SZWdpbWU9PTQpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludGVyX0wsIHltYXg9VHVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTIgJiBFbnZpcm9ubWVudD09IkMiICYgVGVfUmVnaW1lPT00KSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCAmIFRlIGNvbnRyb2wgaW50ZXJzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT01ICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09MSksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFRlX1JlZ2ltZT09NSAmIEVudmlyb25tZW50PT0iTiIgJiBUdV9SZWdpbWU9PTEpLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NSAmIEVudj09Ik4iICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgICYgVHUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICAgIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUZV9SZWdpbWU9PTUgJiBFbnZpcm9ubWVudD09IkMiICYgVHVfUmVnaW1lPT0xKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT01ICYgRW52aXJvbm1lbnQ9PSJDIiAmIFR1X1JlZ2ltZT09MSksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgJiBUdSBjb250cm9sIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCiMjIyMjIGV2b2x2ZWQgSU5URVIgdnMgZXZvbHZlZAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTIgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT01KSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVHVfUmVnaW1lPT0yICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09NSksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0yICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT01KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCAmIFRlIGV2b2x2ZWQgaW50ZXJzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iQyIgJiBUZV9SZWdpbWU9PTUpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludGVyX0wsIHltYXg9VHVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUdV9SZWdpbWU9PTIgJiBFbnZpcm9ubWVudD09IkMiICYgVGVfUmVnaW1lPT01KSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT01KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCAmIFRlIGV2b2x2ZWQgaW50ZXJzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT01ICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09MiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHIsIFRlX1JlZ2ltZT09NSAmIEVudmlyb25tZW50PT0iTiIgJiBUdV9SZWdpbWU9PTIpLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NSAmIEVudj09Ik4iICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgICYgVHUgZXZvbHZlZCBpbnRyYXNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICAgIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyLCBUZV9SZWdpbWU9PTUgJiBFbnZpcm9ubWVudD09IkMiICYgVHVfUmVnaW1lPT0yKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4ciwgVGVfUmVnaW1lPT01ICYgRW52aXJvbm1lbnQ9PSJDIiAmIFR1X1JlZ2ltZT09MiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgICYgVHUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKYGBgCgojIyMjIyBQcmVkaWN0ZWQgdnMgb2JzZXJ2ZWQKCmBgYHtyfQoKc3RyKHBhcmFtX2FsbF93MCkKCnN0cihjYSkKCnJrX2Z1bmM8LSBmdW5jdGlvbihsYW1iZGEsIGFscGhhX2lpLCBhbHBoYV9paiwgZGVuc19pLCBkZW5zX2osIC4uLil7CiAgZ3I8LWxhbWJkYSpleHAoLWFscGhhX2lpKmRlbnNfaSAtIGFscGhhX2lqKmRlbnNfaikKICAKICByZXR1cm4oZ3IpCn0KCnJlZF9jYTwtY2FbLGMoIkVudiIsICJSZXAiLCAiRm9jYWxTUiIsICJDb21wU1IiLCAiRGVucyIsICJUeXBlIiwgIlRlRmVtYWxlcyIsICJUdUZlbWFsZXMiLCAiR3Jvd3RoUmF0ZU9BIildCgpyZWRfY2EKCnJlZF9jYSREZW5zX0ZvY2FsPC1zYXBwbHkoYygxOmxlbmd0aChyZWRfY2FbLDFdKSksIGZ1bmN0aW9uKHgpewogIGlmKHJlZF9jYSRUeXBlW3hdPT0iSU5UUkEiKXsKICAgIGE8LXJlZF9jYSREZW5zW3hdLTEKICB9ZWxzZSBpZihyZWRfY2EkVHlwZVt4XT09IklOVEVSIil7CiAgICBhPC0xCiAgfQogIAogIGEKfSkKCnJlZF9jYSREZW5zX0NvbXA8LXNhcHBseShjKDE6bGVuZ3RoKHJlZF9jYVssMV0pKSwgZnVuY3Rpb24oeCl7CiAgaWYocmVkX2NhJFR5cGVbeF09PSJJTlRSQSIpewogICAgYTwtMAogIH1lbHNlIGlmKHJlZF9jYSRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGE8LXJlZF9jYSREZW5zW3hdLTEKICB9CiAgCiAgYQp9KQoKcmVkX2NhJEZvY2FsPC1tYXB2YWx1ZXMocmVkX2NhJEZvY2FsU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCAiU1I1IikpCnJlZF9jYSRDb21wPC1tYXB2YWx1ZXMocmVkX2NhJENvbXBTUiwgYygxLDIsNCw1KSwgYygiU1IxIiwgIlNSMiIsIlNSNCIsICJTUjUiKSkKCnJlZF9jYSRwcmVkPC1zYXBwbHkoYygxOmxlbmd0aChyZWRfY2FbLDFdKSksIGZ1bmN0aW9uKHgpewogIAogIGlmKHJlZF9jYSRGb2NhbFt4XT09IlNSMSIgfCByZWRfY2EkRm9jYWxbeF09PSJTUjIiKXsKICAgIGF1eF9kYXRhPC1zdWJzZXQocGFyYW1fYWxsX3cwLCBFbnZpcm9ubWVudD09cmVkX2NhJEVudlt4XSAmIFJlcGxpY2F0ZT09IHJlZF9jYSRSZXBbeF0gJiBhcy5jaGFyYWN0ZXIoVHVfUmVnaW1lKT09cmVkX2NhJEZvY2FsW3hdKQogICAgCiAgICBhdXhfcHJlZDwtcmtfZnVuYyhsYW1iZGE9YXV4X2RhdGEkVHVfbGFtYmRhWzFdLCBhbHBoYV9paSA9YXV4X2RhdGEkVHVfaW50cmFbMV0sIGFscGhhX2lqID0gYXV4X2RhdGEkVHVfaW50ZXJbMV0sIGRlbnNfaSA9IHJlZF9jYSREZW5zX0ZvY2FsW3hdLCBkZW5zX2ogPSAgcmVkX2NhJERlbnNfQ29tcFt4XSkKICAgIAogIH1lbHNlIGlmKHJlZF9jYSRGb2NhbFt4XT09IlNSNCIgfCByZWRfY2EkRm9jYWxbeF09PSJTUjUiKXsKICAgIGF1eF9kYXRhPC1zdWJzZXQocGFyYW1fYWxsX3cwLCBFbnZpcm9ubWVudD09cmVkX2NhJEVudlt4XSAmIFJlcGxpY2F0ZT09IHJlZF9jYSRSZXBbeF0gJiBhcy5jaGFyYWN0ZXIoVGVfUmVnaW1lKT09cmVkX2NhJEZvY2FsW3hdKQogICAgCiAgICBhdXhfcHJlZDwtcmtfZnVuYyhsYW1iZGE9YXV4X2RhdGEkVGVfbGFtYmRhWzFdLCBhbHBoYV9paSA9YXV4X2RhdGEkVGVfaW50cmFbMV0sIGFscGhhX2lqID0gYXV4X2RhdGEkVGVfaW50ZXJbMV0sIGRlbnNfaSA9IHJlZF9jYSREZW5zX0ZvY2FsW3hdLCBkZW5zX2ogPSAgcmVkX2NhJERlbnNfQ29tcFt4XSkKICB9CiAgCiAgYXV4X3ByZWQKfSkKCnJlZF9jYSRwcmVkX0w8LXNhcHBseShjKDE6bGVuZ3RoKHJlZF9jYVssMV0pKSwgZnVuY3Rpb24oeCl7CiAgCiAgaWYocmVkX2NhJEZvY2FsW3hdPT0iU1IxIiB8IHJlZF9jYSRGb2NhbFt4XT09IlNSMiIpewogICAgYXV4X2RhdGE8LXN1YnNldChwYXJhbV9hbGxfdzBfbG93ZXIsIEVudmlyb25tZW50PT1yZWRfY2EkRW52W3hdICYgUmVwbGljYXRlPT0gcmVkX2NhJFJlcFt4XSAmIGFzLmNoYXJhY3RlcihUdV9SZWdpbWUpPT1yZWRfY2EkRm9jYWxbeF0pCiAgICAKICAgIGF1eF9wcmVkPC1ya19mdW5jKGxhbWJkYT1hdXhfZGF0YSRUdV9sYW1iZGFbMV0sIGFscGhhX2lpID1hdXhfZGF0YSRUdV9pbnRyYVsxXSwgYWxwaGFfaWogPSBhdXhfZGF0YSRUdV9pbnRlclsxXSwgZGVuc19pID0gcmVkX2NhJERlbnNfRm9jYWxbeF0sIGRlbnNfaiA9ICByZWRfY2EkRGVuc19Db21wW3hdKQogICAgCiAgfWVsc2UgaWYocmVkX2NhJEZvY2FsW3hdPT0iU1I0IiB8IHJlZF9jYSRGb2NhbFt4XT09IlNSNSIpewogICAgYXV4X2RhdGE8LXN1YnNldChwYXJhbV9hbGxfdzBfbG93ZXIsIEVudmlyb25tZW50PT1yZWRfY2EkRW52W3hdICYgUmVwbGljYXRlPT0gcmVkX2NhJFJlcFt4XSAmIGFzLmNoYXJhY3RlcihUZV9SZWdpbWUpPT1yZWRfY2EkRm9jYWxbeF0pCiAgICAKICAgIGF1eF9wcmVkPC1ya19mdW5jKGxhbWJkYT1hdXhfZGF0YSRUZV9sYW1iZGFbMV0sIGFscGhhX2lpID1hdXhfZGF0YSRUZV9pbnRyYVsxXSwgYWxwaGFfaWogPSBhdXhfZGF0YSRUZV9pbnRlclsxXSwgZGVuc19pID0gcmVkX2NhJERlbnNfRm9jYWxbeF0sIGRlbnNfaiA9ICByZWRfY2EkRGVuc19Db21wW3hdKQogIH0KICAKICBhdXhfcHJlZAp9KQoKcmVkX2NhJHByZWRfVTwtc2FwcGx5KGMoMTpsZW5ndGgocmVkX2NhWywxXSkpLCBmdW5jdGlvbih4KXsKICAKICBpZihyZWRfY2EkRm9jYWxbeF09PSJTUjEiIHwgcmVkX2NhJEZvY2FsW3hdPT0iU1IyIil7CiAgICBhdXhfZGF0YTwtc3Vic2V0KHBhcmFtX2FsbF93MF91cHBlciwgRW52aXJvbm1lbnQ9PXJlZF9jYSRFbnZbeF0gJiBSZXBsaWNhdGU9PSByZWRfY2EkUmVwW3hdICYgYXMuY2hhcmFjdGVyKFR1X1JlZ2ltZSk9PXJlZF9jYSRGb2NhbFt4XSkKICAgIAogICAgYXV4X3ByZWQ8LXJrX2Z1bmMobGFtYmRhPWF1eF9kYXRhJFR1X2xhbWJkYVsxXSwgYWxwaGFfaWkgPWF1eF9kYXRhJFR1X2ludHJhWzFdLCBhbHBoYV9paiA9IGF1eF9kYXRhJFR1X2ludGVyWzFdLCBkZW5zX2kgPSByZWRfY2EkRGVuc19Gb2NhbFt4XSwgZGVuc19qID0gIHJlZF9jYSREZW5zX0NvbXBbeF0pCiAgICAKICB9ZWxzZSBpZihyZWRfY2EkRm9jYWxbeF09PSJTUjQiIHwgcmVkX2NhJEZvY2FsW3hdPT0iU1I1Iil7CiAgICBhdXhfZGF0YTwtc3Vic2V0KHBhcmFtX2FsbF93MF91cHBlciwgRW52aXJvbm1lbnQ9PXJlZF9jYSRFbnZbeF0gJiBSZXBsaWNhdGU9PSByZWRfY2EkUmVwW3hdICYgYXMuY2hhcmFjdGVyKFRlX1JlZ2ltZSk9PXJlZF9jYSRGb2NhbFt4XSkKICAgIAogICAgYXV4X3ByZWQ8LXJrX2Z1bmMobGFtYmRhPWF1eF9kYXRhJFRlX2xhbWJkYVsxXSwgYWxwaGFfaWkgPWF1eF9kYXRhJFRlX2ludHJhWzFdLCBhbHBoYV9paiA9IGF1eF9kYXRhJFRlX2ludGVyWzFdLCBkZW5zX2kgPSByZWRfY2EkRGVuc19Gb2NhbFt4XSwgZGVuc19qID0gIHJlZF9jYSREZW5zX0NvbXBbeF0pCiAgfQogIAogIGF1eF9wcmVkCn0pCgpyZWRfY2EkUmVwbGljYXRlPC1yZWRfY2EkUmVwCnN0cihyZWRfY2EpCmdncGxvdChzdWJzZXQocmVkX2NhLCBFbnY9PSJOIiAmIEZvY2FsU1I9PTEpLCBhZXMoeD1sb2coR3Jvd3RoUmF0ZU9BKzEpLCB5PWxvZyhwcmVkKzEpKSkrCiAgZmFjZXRfZ3JpZChDb21wU1J+UmVwbGljYXRlKSsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdD0wKSsKICBnZW9tX3BvaW50KCkrCiAgeWxhYigiUHJlZGljdGVkIikrCiAgeGxhYigiT2JzZXJ2ZWQiKSsKICBnZ3RpdGxlKCJOb3JtYWwgZW52aXJvbm1lbnQgQ29udHJvbCB1cnRpY2FlIikKCmdncGxvdChzdWJzZXQocmVkX2NhLCBFbnY9PSJOIiAmIEZvY2FsU1I9PTEpLCBhZXMoeD1Hcm93dGhSYXRlT0EsIHk9cHJlZCkpKwogIGZhY2V0X2dyaWQoQ29tcFNSflJlcGxpY2F0ZSkrCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQ9MCkrCiAgZ2VvbV9wb2ludCgpKwogIHlsYWIoIlByZWRpY3RlZCIpKwogIHhsYWIoIk9ic2VydmVkIikrCiAgZ2d0aXRsZSgiTm9ybWFsIGVudmlyb25tZW50IENvbnRyb2wgdXJ0aWNhZSIpCgoKZ2dwbG90KHN1YnNldChyZWRfY2EsIEVudj09Ik4iICYgRm9jYWxTUj09MSAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeT1Hcm93dGhSYXRlT0EsIHg9RGVuc19Gb2NhbCkpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIGdlb21fbGluZShhZXMoeT1wcmVkLCB4PURlbnNfRm9jYWwpKSsKIGdlb21fcmliYm9uKGFlcyh5bWluPXByZWRfTCwgeW1heD1wcmVkX1UpLCBmaWxsPSJsaWdodGdyZXkiLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3VyPSJibGFjayIpKwogIHlsYWIoIkdyb3d0aCByYXRlIikrCiAgeGxhYigiRGVuc2l0eSIpKwogIGdndGl0bGUoIk5vcm1hbCBlbnZpcm9ubWVudCBDb250cm9sIHVydGljYWUgSW50cmEiKQoKZ2dwbG90KHN1YnNldChyZWRfY2EsIEVudj09Ik4iICYgRm9jYWxTUj09MSAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PSI0IiksIGFlcyh5PUdyb3d0aFJhdGVPQSwgeD1EZW5zX0NvbXApKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICBnZW9tX2FibGluZShkYXRhPXN1YnNldChwYXJhbV9hbGxfdzAsVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgICYgVGVfUmVnaW1lPT0iU1I0IiksIGFlcyhzbG9wZT0tVHVfaW50ZXIsIGludGVyY2VwdCA9IFR1X2xhbWJkYSkpKwogIHlsYWIoIkdyb3d0aCByYXRlIikrCiAgeGxhYigiRGVuc2l0eSIpKwogIGdndGl0bGUoIk5vcm1hbCBlbnZpcm9ubWVudCBDb250cm9sIHVydGljYWUgSW50ZXIgQ29udHJvbCIpCgpnZ3Bsb3Qoc3Vic2V0KHJlZF9jYSwgRW52PT0iTiIgJiBGb2NhbFNSPT0xICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09IjUiKSwgYWVzKHk9R3Jvd3RoUmF0ZU9BLCB4PURlbnNfQ29tcCkpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIGdlb21fYWJsaW5lKGRhdGE9c3Vic2V0KHBhcmFtX2FsbF93MCxUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJOIiAgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHNsb3BlPS1UdV9pbnRlciwgaW50ZXJjZXB0ID0gVHVfbGFtYmRhKSkrCiAgeWxhYigiR3Jvd3RoIHJhdGUiKSsKICB4bGFiKCJEZW5zaXR5IikrCiAgZ2d0aXRsZSgiTm9ybWFsIGVudmlyb25tZW50IENvbnRyb2wgdXJ0aWNhZSBJbnRlciBFdm9sdmVkIikKCgpgYGAKCgoKIyMjIEIgLSBDWFIgbGFtYmRhIGZpeGVkCgpjeHIgYWNjZXB0cyBhIGRhdGEgZnJhbWUgd2l0aCBhIGZpcnN0IGNvbHVtbiBjYWxsZWQgZml0bmVzcyB3aXRoIHBvc2l0aXZlIHZhbHVlcyBhbmQgbnVtZXJpYyBjb2x1bW5zIHdpdGggbnVtYmVyIG9mIGluZGl2aWR1YWxzLiBFYWNoIHJvdyBpcyBvbmUgaW5kaXZpZHVhbC4gRm9yIG11bHRpcGxlIHNwZWNpZXMgdGhlIGVhc2llciBpcyB0byBjcmVhdGUgYSBsaXN0LCBlYWNoIHdpdGggYSBkYXRhIGZyYW1lIHRoYXQgaGFzIGluIHRoZSBmaXJzdCBjb2x1bW4gbnVtYmVyIG9mIGluZGl2aWR1YWxzIHByb2R1Y2VkIGFuZCB0aGVuIHRoZSBudW1iZXIgb2YgbmVpZ2hib3VycwoKdGhpcyBjYXNlIHdlIHRyYW5zZm9ybWVkIGFsbCAwcyBpbnRvIDEgKHNvIHRoYXQgdGhlIGxvZyBpcyAwKSBGb3IgdGhhdCB3ZSBuZWVkIHRvIGFkZCArMSB0byBhbGwgZGF0YSBzbyB0aGF0IHRoZSB2YXJpYW5jZSBpcyBub3QgY2hhbmdlZAoKIyMjIyMgbm9ybWFsCgpgYGB7cn0KZGlyLmNyZWF0ZSgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZyIsIHNob3dXYXJuaW5ncyA9IEZBTFNFKQoKIyBtb2RpZnlpbmcgZGF0YSBmcmFtZSB0byBmaXQgdGhlIHR5cGUgb2Ygc2V0dXAgdGhhdCBpcyBuZWVkIGZvciBDWFIKQ1hSX0JfTjwtc3Vic2V0KGNhLCBFbnY9PSJOIilbLGMoIlJlcCIsICJGb2NhbFNSIiwgIkNvbXBTUiIsICJEZW5zIiwgIlRlRmVtYWxlcyIsICJUdUZlbWFsZXMiKV0KCkNYUl9CX04kRm9jYWw8LW1hcHZhbHVlcyhDWFJfQl9OJEZvY2FsU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCJTUjUiKSkKQ1hSX0JfTiRDb21wU1IyPC1tYXB2YWx1ZXMoQ1hSX0JfTiRDb21wU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCJTUjUiKSkKCkNYUl9CX04kQ29tcDwtc2FwcGx5KGMoMTpsZW5ndGgoQ1hSX0JfTlssMV0pKSwgZnVuY3Rpb24oeCl7CiAgaWYoaXMubmEoQ1hSX0JfTiRDb21wU1IyW3hdKSl7CiAgICBhPC0gQ1hSX0JfTiRGb2NhbFt4XQogIH1lbHNlewogICAgYTwtQ1hSX0JfTiRDb21wU1IyW3hdCiAgfQogIAogIGEKfSkKCmF1eDwtZGF0YS5mcmFtZShTUjE9cmVwKDAsIGxlbmd0aChDWFJfQl9OWywxXSkpLCBTUjI9cmVwKDAsIGxlbmd0aChDWFJfQl9OWywxXSkpLCBTUjQ9cmVwKDAsIGxlbmd0aChDWFJfQl9OWywxXSkpLCBTUjU9cmVwKDAsIGxlbmd0aChDWFJfQl9OWywxXSkpKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ1hSX0JfTlssMV0pKXsKICAjY29sdW5hIG9uZGUgcG9yIGZvY2FpcwogIGNvbHVuYUY8LXdoaWNoKGNvbG5hbWVzKGF1eCk9PUNYUl9CX04kRm9jYWxbaV0pCiAgI2NvbHVuYSBvbmRlIHBvciBjb21wZXRpZG9ycwogIGNvbHVuYUM8LXdoaWNoKGNvbG5hbWVzKGF1eCk9PUNYUl9CX04kQ29tcFtpXSkKICAKICAjaWYgaXRzIHRoZSBzYW1lIHJlZ2ltZQogIGlmKENYUl9CX04kRm9jYWxbaV09PUNYUl9CX04kQ29tcFtpXSAmIENYUl9CX04kRGVuc1tpXT09MSl7CiAgICBhdXhbaSxjb2x1bmFGXTwtQ1hSX0JfTiREZW5zW2ldLTEKICAgIAogIH1lbHNlIGlmKENYUl9CX04kRm9jYWxbaV09PUNYUl9CX04kQ29tcFtpXSl7CiAgICBhdXhbaSxjb2x1bmFGXTwtQ1hSX0JfTiREZW5zW2ldLTEKICB9ZWxzZXsgI2lmIGl0IGlzIGhldGVyb3NwZWNpZmljIHRoZW4gaXRzIC0xIGZvciB0aGUgY29tcGV0aXRvcnMgKGJlY2F1c2Ugb2YgdGhlIGZvY2FsKSBhbmQgaXRzIG9uZSBmb3IgdGhlIGZvY2FsCiAgICBhdXhbaSxjb2x1bmFDXTwtQ1hSX0JfTiREZW5zW2ldLTEKICAgIGF1eFtpLCBjb2x1bmFGXTwtMQogIH0KICAKfQoKQ1hSX0JfTjwtY2JpbmQoQ1hSX0JfTiwgYXV4KQoKQ1hSX0JfTiRmaXRuZXNzPC1zYXBwbHkoYygxOmxlbmd0aChDWFJfQl9OWywxXSkpLCBmdW5jdGlvbih4KXsKICBjb2xGPC13aGljaChjb2xuYW1lcyhDWFJfQl9OKT09Q1hSX0JfTiRGb2NhbFt4XSkKICAKICBpZihDWFJfQl9OJEZvY2FsW3hdPT0iU1IxIil7CiAgICBhPC1DWFJfQl9OJFR1RmVtYWxlc1t4XS9DWFJfQl9OJFNSMVt4XQogIH0gZWxzZSBpZihDWFJfQl9OJEZvY2FsW3hdPT0iU1IyIil7CiAgICBhPC1DWFJfQl9OJFR1RmVtYWxlc1t4XS9DWFJfQl9OJFNSMlt4XQogIH0gZWxzZSBpZihDWFJfQl9OJEZvY2FsW3hdPT0iU1I0Iil7CiAgICBhPC1DWFJfQl9OJFRlRmVtYWxlc1t4XS9DWFJfQl9OJFNSNFt4XQogIH0gZWxzZSBpZihDWFJfQl9OJEZvY2FsW3hdPT0iU1I1Iil7CiAgICBhPC1DWFJfQl9OJFRlRmVtYWxlc1t4XS9DWFJfQl9OJFNSNVt4XQogIH0KICAKICBhCn0pCgojcmVtb3Zpbmcgcm93cyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gZGF0YSBmb3IgZml0bmVzcwpDWFJfQl9OPC1DWFJfQl9OWy13aGljaChpcy5uYShDWFJfQl9OJGZpdG5lc3MpKSxdCgojIGFkZGluZyArMSB0byBhbGwgZGF0YQojQ1hSX0JfTiRmaXRuZXNzPC1DWFJfQl9OJGZpdG5lc3MrMQoKQ1hSX0JfTlt3aGljaChDWFJfQl9OJGZpdG5lc3M9PSItSW5mIiB8IENYUl9CX04kZml0bmVzcz09IkluZiIpLCJmaXRuZXNzIl08LTAKCgojIGFsbCBkYXRhIGdldHMgKzEgYmVjYXVzZSBvZiB0aGUgMCBwcm9ibGVtCkNYUl9CX04kZml0bmVzczwtQ1hSX0JfTiRmaXRuZXNzKzEKCiMgdmVjdG9yIHRoYXQgdGVsbHMgd2hpY2ggYXJlIHRoZSBzZWxlY3Rpb24gcmVnaW1lcywgdGhlIGNvbHVtbnMgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIG5hbWUKbXkucmVnIDwtIGMoIlNSMSIsICJTUjIiLCJTUjQiLCJTUjUiKQoKIyBEbyBsaXN0IHBlciByZXBsaWNhdGUgYW5kIGVudmlyb25tZW50ClIxPC1saXN0KFNSMT0gc3Vic2V0KENYUl9CX04sIFJlcD09MSAmIEZvY2FsPT0iU1IxIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjI9IHN1YnNldChDWFJfQl9OLCBSZXA9PTEgJiBGb2NhbD09IlNSMiIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoQ1hSX0JfTiwgUmVwPT0xICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSNT0gc3Vic2V0KENYUl9CX04sIFJlcD09MSAmIEZvY2FsPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildKQoKUjI8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0JfTiwgUmVwPT0yICYgRm9jYWw9PSJTUjEiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoQ1hSX0JfTiwgUmVwPT0yICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1I0IiwgIlNSNSIpXSwgU1I1PSBzdWJzZXQoQ1hSX0JfTiwgUmVwPT0yICYgRm9jYWw9PSJTUjUiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1I0IiwgIlNSNSIpXSkKClIzPC1saXN0KFNSMT0gc3Vic2V0KENYUl9CX04sIFJlcD09MyAmIEZvY2FsPT0iU1IxIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjI9IHN1YnNldChDWFJfQl9OLCBSZXA9PTMgJiBGb2NhbD09IlNSMiIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoQ1hSX0JfTiwgUmVwPT0zICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSNT0gc3Vic2V0KENYUl9CX04sIFJlcD09MyAmIEZvY2FsPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildKQoKUjQ8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0JfTiwgUmVwPT00ICYgRm9jYWw9PSJTUjEiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KENYUl9CX04sIFJlcD09NCAmIEZvY2FsPT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQl9OLCBSZXA9PTQgJiBGb2NhbD09IlNSNCIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1I1PSBzdWJzZXQoQ1hSX0JfTiwgUmVwPT00ICYgRm9jYWw9PSJTUjUiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0pCgpSNTwtbGlzdChTUjE9IHN1YnNldChDWFJfQl9OLCBSZXA9PTUgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1IyPSBzdWJzZXQoQ1hSX0JfTiwgUmVwPT01ICYgRm9jYWw9PSJTUjIiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSND0gc3Vic2V0KENYUl9CX04sIFJlcD09NSAmIEZvY2FsPT0iU1I0IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjU9IHN1YnNldChDWFJfQl9OLCBSZXA9PTUgJiBGb2NhbD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSkKCm1lYW5fZGVuczE8LWRhdGEuZnJhbWUoU1I9YyhyZXAoMSwxMCksIHJlcCgyLDgpLCByZXAoNCwxMCkscmVwKDUsMTApKSwgRW52PWMocmVwKCJOIiwgNSkscmVwKCJDZCIsIDUpLCByZXAoIk4iLCA0KSxyZXAoIkNkIiwgNCkscmVwKCJOIiwgNSkscmVwKCJDZCIsIDUpLHJlcCgiTiIsIDUpLHJlcCgiQ2QiLCA1KSksIFJlcD1jKHJlcChjKDEsMiwzLDQsNSksMikscmVwKGMoMSwzLDQsNSksMikscmVwKGMoMSwyLDMsNCw1KSwyKSxyZXAoYygxLDIsMyw0LDUpLDIpKSkKCgojc2luY2UgaW4gdGhlIG1vZGVsIHdlIHVzZSB0aGUgbG9nIG9mIGRhdGEgKzEsIGhlcmUgd2UgYWxzbyBoYXZlIHRvIHVzZSB0aGUgKzEgdG8gZXN0aW1hdGUgdGhlIGxhbWJkYQptZWFuX2RlbnMxJGxhbWJkYTwtc2FwcGx5KGMoMTpsZW5ndGgobWVhbl9kZW5zMVssMV0pKSwgZnVuY3Rpb24oeCl7CiAgbWVhbihzdWJzZXQoY2EsIEZvY2FsU1I9PW1lYW5fZGVuczEkU1JbeF0gJiBEZW5zPT0xICYgRW52PT1tZWFuX2RlbnMxJEVudlt4XSAmIFJlcD09bWVhbl9kZW5zMSRSZXBbeF0gKSRHcm93dGhSYXRlT0ErMSwgbmEucm09VFJVRSkKfSkKCgptZWFuX2RlbnMxJHNkX2xhbWJkYTwtc2FwcGx5KGMoMTpsZW5ndGgobWVhbl9kZW5zMVssMV0pKSwgZnVuY3Rpb24oeCl7CiAgc2Qoc3Vic2V0KGNhLCBGb2NhbFNSPT1tZWFuX2RlbnMxJFNSW3hdICYgRGVucz09MSAmIEVudj09bWVhbl9kZW5zMSRFbnZbeF0gJiBSZXA9PW1lYW5fZGVuczEkUmVwW3hdKSRHcm93dGhSYXRlT0ErMSwgbmEucm09VFJVRSkKfSkKCm1lYW5fZGVuczEkc2RfbGFtYmRhW3doaWNoKGlzLm5hKG1lYW5fZGVuczEkc2RfbGFtYmRhKSldPC0wLjAxCm1lYW5fZGVuczEkc2RfbGFtYmRhW3doaWNoKG1lYW5fZGVuczEkc2RfbGFtYmRhPT0wKV08LTAuMDEKCiMjIyMgbGFtYmRhCgpmaXhlZF90ZXJtc18xTiA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09Ik4iICYgU1I9PTEpJGxhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTEgJiBFbnY9PSJOIiAmIFNSPT0yKSRsYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTEgJiBFbnY9PSJOIiAmIFNSPT00KSRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iTiIgJiBTUj09NSkkbGFtYmRhKSkKCmZpeGVkX3Rlcm1zXzJOIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0yICYgRW52PT0iTiIgJiBTUj09MSkkbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MiAmIEVudj09Ik4iICYgU1I9PTQpJGxhbWJkYSksCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGE9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTIgJiBFbnY9PSJOIiAmIFNSPT01KSRsYW1iZGEpKQoKZml4ZWRfdGVybXNfM04gPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTMgJiBFbnY9PSJOIiAmIFNSPT0xKSRsYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0zICYgRW52PT0iTiIgJiBTUj09MikkbGFtYmRhKSwgIyBmb2NhbCBzcCAyCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0zICYgRW52PT0iTiIgJiBTUj09NCkkbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09Ik4iICYgU1I9PTUpJGxhbWJkYSkpCgpmaXhlZF90ZXJtc180TiA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NCAmIEVudj09Ik4iICYgU1I9PTEpJGxhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJOIiAmIFNSPT0yKSRsYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJOIiAmIFNSPT00KSRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT00ICYgRW52PT0iTiIgJiBTUj09NSkkbGFtYmRhKSkKCmZpeGVkX3Rlcm1zXzVOIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT01ICYgRW52PT0iTiIgJiBTUj09MSkkbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09Ik4iICYgU1I9PTIpJGxhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09Ik4iICYgU1I9PTQpJGxhbWJkYSksCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGE9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTUgJiBFbnY9PSJOIiAmIFNSPT01KSRsYW1iZGEpKQoKCmN4cl9CLlIxX3cwPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBteS5yZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAicGFpcndpc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzFOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCgpjeHJfQi5SMl93MDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludHJhID0gMC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gZml4ZWRfdGVybXNfMk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKY3hyX0IuUjNfdzA8LWN4cl9wbV9tdWx0aWZpdChkYXRhID0gUjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IG15LnJlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJwYWlyd2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QoYWxwaGFfaW50cmEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBmaXhlZF90ZXJtc18zTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpjeHJfQi5SNF93MDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzNOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9CLlI1X3cwPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBteS5yZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAicGFpcndpc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QoYWxwaGFfaW50cmEgPSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBmaXhlZF90ZXJtc181TiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpzdW1tYXJ5KGN4cl9CLlIxX3cwKQpzdW1tYXJ5KGN4cl9CLlIyX3cwKQpzdW1tYXJ5KGN4cl9CLlIzX3cwKQpzdW1tYXJ5KGN4cl9CLlI0X3cwKQpzdW1tYXJ5KGN4cl9CLlI1X3cwKQoKI2FiPC1hYnVuZGFuY2VfcHJvamVjdGlvbihjeHJfQi5SMV93MCwgdGltZXN0ZXBzID0gMSwgaW5pdGlhbF9hYnVuZGFuY2VzID0gYygzLDMsMywzKSkKCmBgYAoKcm93cyBpbiB0aGUgYWxwaGEgZWxlbWVudCBvZiB0aGUgcmV0dXJuaW5nIGxpc3QgY29ycmVzcG9uZCB0byBzcGVjaWVzIGkgYW5kIGNvbHVtbnMgdG8gc3BlY2llcyBqIGZvciBlYWNoIM6xaWogY29lZmZpY2llbnQuCgojIyMjIyMgZGF0YSB0YWJsZSBzdW1tYXJ5CgpgYGB7cn0KCmN4cl9wYXJhbV9CPC1leHBhbmQuZ3JpZChUdV9SZWdpbWU9YygiU1IxIiwgIlNSMiIpLCBUZV9SZWdpbWU9YygiU1I0IiwgIlNSNSIpLCBSZXBsaWNhdGU9YygxLDIsMyw0LDUpLCBFbnZpcm9ubWVudD1jKCJOIikpCmN4cl9wYXJhbV9CJFR1X2xhbWJkYTwtMApjeHJfcGFyYW1fQiRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX0IkVHVfaW50cmE8LTAKY3hyX3BhcmFtX0IkVGVfaW50cmE8LTAKY3hyX3BhcmFtX0IkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX0IkVGVfaW50ZXI8LTAKCiNyZW1vdmluZyBTUjIgZm9yIHJlcGxpY2F0ZSAyCmN4cl9wYXJhbV9CPC1jeHJfcGFyYW1fQlstd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0yICYgY3hyX3BhcmFtX0IkVHVfUmVnaW1lPT0iU1IyIiksXQoKCmN4cl9wYXJhbV9CW3doaWNoKGN4cl9wYXJhbV9CJFJlcGxpY2F0ZT09MSksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlIxX3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLGN4cl9CLlIxX3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQlt3aGljaChjeHJfcGFyYW1fQiRSZXBsaWNhdGU9PTEpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SMV93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSxjeHJfQi5SMV93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSwgY3hyX0IuUjFfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEsY3hyX0IuUjFfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQlt3aGljaChjeHJfcGFyYW1fQiRSZXBsaWNhdGU9PTIpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SMl93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYSxjeHJfQi5SMl93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYSkKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0yKSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjJfdzAkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEsY3hyX0IuUjJfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQlt3aGljaChjeHJfcGFyYW1fQiRSZXBsaWNhdGU9PTMpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SM193MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYSxjeHJfQi5SM193MCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0zKSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjNfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEsY3hyX0IuUjNfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEsIGN4cl9CLlIzX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLGN4cl9CLlIzX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT00KSwiVHVfbGFtYmRhIl08LWMoY3hyX0IuUjRfdzAkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEsY3hyX0IuUjRfdzAkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9CW3doaWNoKGN4cl9wYXJhbV9CJFJlcGxpY2F0ZT09NCksIlRlX2xhbWJkYSJdPC1jKGN4cl9CLlI0X3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLGN4cl9CLlI0X3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLCBjeHJfQi5SNF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSxjeHJfQi5SNF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9CW3doaWNoKGN4cl9wYXJhbV9CJFJlcGxpY2F0ZT09NSksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlI1X3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLGN4cl9CLlI1X3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQlt3aGljaChjeHJfcGFyYW1fQiRSZXBsaWNhdGU9PTUpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SNV93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSxjeHJfQi5SNV93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSwgY3hyX0IuUjVfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEsY3hyX0IuUjVfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEpCgoKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0xKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFsyLDJdKSwgMikKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzMsM10sIGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0yKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4WzEsMV0pLCAyKQpjeHJfcGFyYW1fQlt3aGljaChjeHJfcGFyYW1fQiRSZXBsaWNhdGU9PTIpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhbMiwyXSwgY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4WzMsM10pKQoKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0zKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFsyLDJdKSwgMikKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0zKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzMsM10sIGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT00KSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFsyLDJdKSwgMikKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT00KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzMsM10sIGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT01KSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFsyLDJdKSwgMikKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT01KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzMsM10sIGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKCmN4cl9wYXJhbV9CW3doaWNoKGN4cl9wYXJhbV9CJFJlcGxpY2F0ZT09MSksIlR1X2ludGVyIl08LWMoY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzEsM10sIGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFsyLDNdLGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFsxLDRdLCBjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0xKSwiVGVfaW50ZXIiXTwtYyhjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbMywxXSwgY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzMsMl0sY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzQsMV0sIGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFs0LDJdKQoKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT0yKSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhbMSwyXSwgY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4WzEsM10pCmN4cl9wYXJhbV9CW3doaWNoKGN4cl9wYXJhbV9CJFJlcGxpY2F0ZT09MiksIlRlX2ludGVyIl08LWMoY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4WzIsMV0sY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4WzMsMV0pCgpjeHJfcGFyYW1fQlt3aGljaChjeHJfcGFyYW1fQiRSZXBsaWNhdGU9PTMpLCJUdV9pbnRlciJdPC1jKGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFsxLDNdLCBjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbMiwzXSxjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbMSw0XSwgY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzIsNF0pCmN4cl9wYXJhbV9CW3doaWNoKGN4cl9wYXJhbV9CJFJlcGxpY2F0ZT09MyksIlRlX2ludGVyIl08LWMoY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFszLDJdLGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFs0LDFdLCBjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbNCwyXSkKCmN4cl9wYXJhbV9CW3doaWNoKGN4cl9wYXJhbV9CJFJlcGxpY2F0ZT09NCksIlR1X2ludGVyIl08LWMoY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzEsM10sIGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFsyLDNdLGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFsxLDRdLCBjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT00KSwiVGVfaW50ZXIiXTwtYyhjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbMywxXSwgY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzMsMl0sY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzQsMV0sIGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFs0LDJdKQoKY3hyX3BhcmFtX0Jbd2hpY2goY3hyX3BhcmFtX0IkUmVwbGljYXRlPT01KSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbMSwzXSwgY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzIsM10sY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzEsNF0sIGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFsyLDRdKQpjeHJfcGFyYW1fQlt3aGljaChjeHJfcGFyYW1fQiRSZXBsaWNhdGU9PTUpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFszLDFdLCBjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbMywyXSxjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbNCwxXSwgY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzQsMl0pCgojIyMgTG93ZXIKCmN4cl9wYXJhbV9CX2xvd2VyPC1leHBhbmQuZ3JpZChUdV9SZWdpbWU9YygiU1IxIiwgIlNSMiIpLCBUZV9SZWdpbWU9YygiU1I0IiwgIlNSNSIpLCBSZXBsaWNhdGU9YygxLDIsMyw0LDUpLCBFbnZpcm9ubWVudD1jKCJOIikpCmN4cl9wYXJhbV9CX2xvd2VyJFR1X2xhbWJkYTwtMApjeHJfcGFyYW1fQl9sb3dlciRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX0JfbG93ZXIkVHVfaW50cmE8LTAKY3hyX3BhcmFtX0JfbG93ZXIkVGVfaW50cmE8LTAKY3hyX3BhcmFtX0JfbG93ZXIkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX0JfbG93ZXIkVGVfaW50ZXI8LTAKCiNyZW1vdmluZyBTUjIgZm9yIHJlcGxpY2F0ZSAyCmN4cl9wYXJhbV9CX2xvd2VyPC1jeHJfcGFyYW1fQl9sb3dlclstd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT0yICYgY3hyX3BhcmFtX0JfbG93ZXIkVHVfUmVnaW1lPT0iU1IyIiksXQoKI1NpbmNlIHRoZSBlcnJvciBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBkYXRhIHdlIG5lZWQgdG8gY3JlYXRlIHNvbWUgbGlzdHMgd2l0aCB0aGF0IGluZm9ybWF0aW9uCnNkXzFOIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iTiIgJiBTUj09MSkkc2RfbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09Ik4iICYgU1I9PTIpJHNkX2xhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09Ik4iICYgU1I9PTQpJHNkX2xhbWJkYSksCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGE9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTEgJiBFbnY9PSJOIiAmIFNSPT01KSRzZF9sYW1iZGEpKQoKc2RfMk4gPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTIgJiBFbnY9PSJOIiAmIFNSPT0xKSRzZF9sYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0yICYgRW52PT0iTiIgJiBTUj09NCkkc2RfbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MiAmIEVudj09Ik4iICYgU1I9PTUpJHNkX2xhbWJkYSkpCgpzZF8zTiA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09Ik4iICYgU1I9PTEpJHNkX2xhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTMgJiBFbnY9PSJOIiAmIFNSPT0yKSRzZF9sYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTMgJiBFbnY9PSJOIiAmIFNSPT00KSRzZF9sYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0zICYgRW52PT0iTiIgJiBTUj09NSkkc2RfbGFtYmRhKSkKCnNkXzROIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT00ICYgRW52PT0iTiIgJiBTUj09MSkkc2RfbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NCAmIEVudj09Ik4iICYgU1I9PTIpJHNkX2xhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NCAmIEVudj09Ik4iICYgU1I9PTQpJHNkX2xhbWJkYSksCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGE9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJOIiAmIFNSPT01KSRzZF9sYW1iZGEpKQoKc2RfNU4gPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTUgJiBFbnY9PSJOIiAmIFNSPT0xKSRzZF9sYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT01ICYgRW52PT0iTiIgJiBTUj09Mikkc2RfbGFtYmRhKSwgIyBmb2NhbCBzcCAyCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT01ICYgRW52PT0iTiIgJiBTUj09NCkkc2RfbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09Ik4iICYgU1I9PTUpJHNkX2xhbWJkYSkpCgpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SMV93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYS1zZF8xTltbMV1dJGxhbWJkYSxjeHJfQi5SMV93MCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYS1zZF8xTltbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0JfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT0xKSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjFfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfMU5bWzNdXSRsYW1iZGEsY3hyX0IuUjFfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfMU5bWzNdXSRsYW1iZGEsIGN4cl9CLlIxX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzFOW1s0XV0kbGFtYmRhLGN4cl9CLlIxX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzFOW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0JfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT0yKSwiVHVfbGFtYmRhIl08LWMoY3hyX0IuUjJfdzAkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEtc2RfMk5bWzFdXSRsYW1iZGEsY3hyX0IuUjJfdzAkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEtc2RfMk5bWzFdXSRsYW1iZGEpCmN4cl9wYXJhbV9CX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CX2xvd2VyJFJlcGxpY2F0ZT09MiksIlRlX2xhbWJkYSJdPC1jKGN4cl9CLlIyX3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhLXNkXzJOW1syXV0kbGFtYmRhLGN4cl9CLlIyX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzJOW1szXV0kbGFtYmRhKQoKY3hyX3BhcmFtX0JfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT0zKSwiVHVfbGFtYmRhIl08LWMoY3hyX0IuUjNfdzAkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEtc2RfM05bWzFdXSRsYW1iZGEsY3hyX0IuUjNfdzAkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEtc2RfM05bWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9CX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CX2xvd2VyJFJlcGxpY2F0ZT09MyksIlRlX2xhbWJkYSJdPC1jKGN4cl9CLlIzX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzNOW1szXV0kbGFtYmRhLGN4cl9CLlIzX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzNOW1szXV0kbGFtYmRhLCBjeHJfQi5SM193MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF8zTltbNF1dJGxhbWJkYSxjeHJfQi5SM193MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF8zTltbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9CX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CX2xvd2VyJFJlcGxpY2F0ZT09NCksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlI0X3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLXNkXzROW1sxXV0kbGFtYmRhLGN4cl9CLlI0X3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhLXNkXzROW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTQpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SNF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF80TltbM11dJGxhbWJkYSxjeHJfQi5SNF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF80TltbM11dJGxhbWJkYSwgY3hyX0IuUjRfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfNE5bWzRdXSRsYW1iZGEsY3hyX0IuUjRfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfNE5bWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTUpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SNV93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYS1zZF81TltbMV1dJGxhbWJkYSxjeHJfQi5SNV93MCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYS1zZF81TltbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0JfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT01KSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjVfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfNU5bWzNdXSRsYW1iZGEsY3hyX0IuUjVfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfNU5bWzNdXSRsYW1iZGEsIGN4cl9CLlI1X3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzVOW1s0XV0kbGFtYmRhLGN4cl9CLlI1X3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzVOW1s0XV0kbGFtYmRhKQoKCmN4cl9wYXJhbV9CX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CX2xvd2VyJFJlcGxpY2F0ZT09MSksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFsxLDFdLWN4cl9CLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbMiwyXS1jeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSksIDIpCmN4cl9wYXJhbV9CX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CX2xvd2VyJFJlcGxpY2F0ZT09MSksIlRlX2ludHJhIl08LXJlcChjKGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFszLDNdLWN4cl9CLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbNCw0XS1jeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV9CX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CX2xvd2VyJFJlcGxpY2F0ZT09MiksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlIyX3cwJGFscGhhX21hdHJpeFsxLDFdLWN4cl9CLlIyX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdKSwgMikKY3hyX3BhcmFtX0JfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT0yKSwiVGVfaW50cmEiXTwtYyhjeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhbMiwyXS1jeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSwgY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4WzMsM10tY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsM10pCgpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTMpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbMSwxXS1jeHJfQi5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzIsMl0tY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbMywzXS1jeHJfQi5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywzXSwgY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzQsNF0tY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTQpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbMSwxXS1jeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzIsMl0tY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbMywzXS1jeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywzXSwgY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzQsNF0tY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTUpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbMSwxXS1jeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzIsMl0tY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbMywzXS1jeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywzXSwgY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzQsNF0tY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsNF0pLCBlYWNoPTIpCgoKY3hyX3BhcmFtX0JfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT0xKSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbMSwzXS1jeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzIsM10tY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzEsNF0tY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFsyLDRdLWN4cl9CLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTEpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFszLDFdLWN4cl9CLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbMywyXS1jeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbNCwxXS1jeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzQsMl0tY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTIpLCJUdV9pbnRlciJdPC1jKGN4cl9CLlIyX3cwJGFscGhhX21hdHJpeFsxLDJdLWN4cl9CLlIyX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDJdLCBjeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhbMSwzXS1jeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSkKY3hyX3BhcmFtX0JfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT0yKSwiVGVfaW50ZXIiXTwtYyhjeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhbMiwxXS1jeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwxXSwgY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0pCgpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTMpLCJUdV9pbnRlciJdPC1jKGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFsxLDNdLWN4cl9CLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbMiwzXS1jeHJfQi5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbMSw0XS1jeHJfQi5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzIsNF0tY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV9CX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CX2xvd2VyJFJlcGxpY2F0ZT09MyksIlRlX2ludGVyIl08LWMoY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFszLDJdLWN4cl9CLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFs0LDFdLWN4cl9CLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbNCwyXS1jeHJfQi5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV9CX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CX2xvd2VyJFJlcGxpY2F0ZT09NCksIlR1X2ludGVyIl08LWMoY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzEsM10tY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFsyLDNdLWN4cl9CLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFsxLDRdLWN4cl9CLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbMiw0XS1jeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0JfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT00KSwiVGVfaW50ZXIiXTwtYyhjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbMywxXS1jeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzMsMl0tY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzQsMV0tY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFs0LDJdLWN4cl9CLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX0JfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JfbG93ZXIkUmVwbGljYXRlPT01KSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbMSwzXS1jeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzIsM10tY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzEsNF0tY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFsyLDRdLWN4cl9CLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fQl9sb3dlclt3aGljaChjeHJfcGFyYW1fQl9sb3dlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFszLDFdLWN4cl9CLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbMywyXS1jeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbNCwxXS1jeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzQsMl0tY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgojIyMgdXBwZXIKCmN4cl9wYXJhbV9CX3VwcGVyPC1leHBhbmQuZ3JpZChUdV9SZWdpbWU9YygiU1IxIiwgIlNSMiIpLCBUZV9SZWdpbWU9YygiU1I0IiwgIlNSNSIpLCBSZXBsaWNhdGU9YygxLDIsMyw0LDUpLCBFbnZpcm9ubWVudD1jKCJOIikpCmN4cl9wYXJhbV9CX3VwcGVyJFR1X2xhbWJkYTwtMApjeHJfcGFyYW1fQl91cHBlciRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX0JfdXBwZXIkVHVfaW50cmE8LTAKY3hyX3BhcmFtX0JfdXBwZXIkVGVfaW50cmE8LTAKY3hyX3BhcmFtX0JfdXBwZXIkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX0JfdXBwZXIkVGVfaW50ZXI8LTAKCiNyZW1vdmluZyBTUjIgZm9yIHJlcGxpY2F0ZSAyCmN4cl9wYXJhbV9CX3VwcGVyPC1jeHJfcGFyYW1fQl91cHBlclstd2hpY2goY3hyX3BhcmFtX0JfdXBwZXIkUmVwbGljYXRlPT0yICYgY3hyX3BhcmFtX0JfdXBwZXIkVHVfUmVnaW1lPT0iU1IyIiksXQoKCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09MSksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlIxX3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhK3NkXzFOW1sxXV0kbGFtYmRhLGN4cl9CLlIxX3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhK3NkXzFOW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQl91cHBlclt3aGljaChjeHJfcGFyYW1fQl91cHBlciRSZXBsaWNhdGU9PTEpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SMV93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF8xTltbM11dJGxhbWJkYSxjeHJfQi5SMV93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF8xTltbM11dJGxhbWJkYSwgY3hyX0IuUjFfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfMU5bWzRdXSRsYW1iZGEsY3hyX0IuUjFfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfMU5bWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQl91cHBlclt3aGljaChjeHJfcGFyYW1fQl91cHBlciRSZXBsaWNhdGU9PTIpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SMl93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYStzZF8yTltbMV1dJGxhbWJkYSxjeHJfQi5SMl93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYStzZF8yTltbMV1dJGxhbWJkYSkKY3hyX3BhcmFtX0JfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JfdXBwZXIkUmVwbGljYXRlPT0yKSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjJfdzAkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGErc2RfMk5bWzJdXSRsYW1iZGEsY3hyX0IuUjJfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfMk5bWzNdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQl91cHBlclt3aGljaChjeHJfcGFyYW1fQl91cHBlciRSZXBsaWNhdGU9PTMpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SM193MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYStzZF8zTltbMV1dJGxhbWJkYSxjeHJfQi5SM193MCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYStzZF8zTltbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0JfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JfdXBwZXIkUmVwbGljYXRlPT0zKSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjNfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfM05bWzNdXSRsYW1iZGEsY3hyX0IuUjNfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfM05bWzNdXSRsYW1iZGEsIGN4cl9CLlIzX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzNOW1s0XV0kbGFtYmRhLGN4cl9CLlIzX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzNOW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0JfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JfdXBwZXIkUmVwbGljYXRlPT00KSwiVHVfbGFtYmRhIl08LWMoY3hyX0IuUjRfdzAkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGErc2RfNE5bWzFdXSRsYW1iZGEsY3hyX0IuUjRfdzAkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGErc2RfNE5bWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09NCksIlRlX2xhbWJkYSJdPC1jKGN4cl9CLlI0X3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhK3NkXzROW1szXV0kbGFtYmRhLGN4cl9CLlI0X3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhK3NkXzROW1szXV0kbGFtYmRhLCBjeHJfQi5SNF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYStzZF80TltbNF1dJGxhbWJkYSxjeHJfQi5SNF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYStzZF80TltbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09NSksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlI1X3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhK3NkXzVOW1sxXV0kbGFtYmRhLGN4cl9CLlI1X3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhK3NkXzVOW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQl91cHBlclt3aGljaChjeHJfcGFyYW1fQl91cHBlciRSZXBsaWNhdGU9PTUpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SNV93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF81TltbM11dJGxhbWJkYSxjeHJfQi5SNV93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF81TltbM11dJGxhbWJkYSwgY3hyX0IuUjVfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfNU5bWzRdXSRsYW1iZGEsY3hyX0IuUjVfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfNU5bWzRdXSRsYW1iZGEpCgoKY3hyX3BhcmFtX0JfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JfdXBwZXIkUmVwbGljYXRlPT0xKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzEsMV0rY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFsyLDJdK2N4cl9CLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX0JfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JfdXBwZXIkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzMsM10rY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsM10sIGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFs0LDRdK2N4cl9CLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0JfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JfdXBwZXIkUmVwbGljYXRlPT0yKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4WzEsMV0rY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0pLCAyKQpjeHJfcGFyYW1fQl91cHBlclt3aGljaChjeHJfcGFyYW1fQl91cHBlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRyYSJdPC1jKGN4cl9CLlIyX3cwJGFscGhhX21hdHJpeFsyLDJdK2N4cl9CLlIyX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdLCBjeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhbMywzXStjeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywzXSkKCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09MyksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFsxLDFdK2N4cl9CLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbMiwyXStjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSksIDIpCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09MyksIlRlX2ludHJhIl08LXJlcChjKGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFszLDNdK2N4cl9CLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbNCw0XStjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09NCksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFsxLDFdK2N4cl9CLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbMiwyXStjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSksIDIpCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09NCksIlRlX2ludHJhIl08LXJlcChjKGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFszLDNdK2N4cl9CLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbNCw0XStjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09NSksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFsxLDFdK2N4cl9CLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbMiwyXStjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSksIDIpCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09NSksIlRlX2ludHJhIl08LXJlcChjKGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFszLDNdK2N4cl9CLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbNCw0XStjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCgpjeHJfcGFyYW1fQl91cHBlclt3aGljaChjeHJfcGFyYW1fQl91cHBlciRSZXBsaWNhdGU9PTEpLCJUdV9pbnRlciJdPC1jKGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFsxLDNdK2N4cl9CLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbMiwzXStjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbMSw0XStjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzIsNF0rY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09MSksIlRlX2ludGVyIl08LWMoY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4WzMsMV0rY3hyX0IuUjFfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFszLDJdK2N4cl9CLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9CLlIxX3cwJGFscGhhX21hdHJpeFs0LDFdK2N4cl9CLlIxX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhbNCwyXStjeHJfQi5SMV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09MiksIlR1X2ludGVyIl08LWMoY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4WzEsMl0rY3hyX0IuUjJfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMl0sIGN4cl9CLlIyX3cwJGFscGhhX21hdHJpeFsxLDNdK2N4cl9CLlIyX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdKQpjeHJfcGFyYW1fQl91cHBlclt3aGljaChjeHJfcGFyYW1fQl91cHBlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlIyX3cwJGFscGhhX21hdHJpeFsyLDFdK2N4cl9CLlIyX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdLCBjeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhbMywxXStjeHJfQi5SMl93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSkKCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09MyksIlR1X2ludGVyIl08LWMoY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzEsM10rY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFsyLDNdK2N4cl9CLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFsxLDRdK2N4cl9CLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbMiw0XStjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0JfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JfdXBwZXIkUmVwbGljYXRlPT0zKSwiVGVfaW50ZXIiXTwtYyhjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhbMywxXStjeHJfQi5SM193MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzMsMl0rY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4WzQsMV0rY3hyX0IuUjNfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIGN4cl9CLlIzX3cwJGFscGhhX21hdHJpeFs0LDJdK2N4cl9CLlIzX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX0JfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JfdXBwZXIkUmVwbGljYXRlPT00KSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbMSwzXStjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzIsM10rY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzEsNF0rY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFsyLDRdK2N4cl9CLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fQl91cHBlclt3aGljaChjeHJfcGFyYW1fQl91cHBlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlI0X3cwJGFscGhhX21hdHJpeFszLDFdK2N4cl9CLlI0X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbMywyXStjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQi5SNF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4WzQsMl0rY3hyX0IuUjRfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQl91cHBlclt3aGljaChjeHJfcGFyYW1fQl91cHBlciRSZXBsaWNhdGU9PTUpLCJUdV9pbnRlciJdPC1jKGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFsxLDNdK2N4cl9CLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbMiwzXStjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbMSw0XStjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzIsNF0rY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV9CX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CX3VwcGVyJFJlcGxpY2F0ZT09NSksIlRlX2ludGVyIl08LWMoY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4WzMsMV0rY3hyX0IuUjVfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFszLDJdK2N4cl9CLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9CLlI1X3cwJGFscGhhX21hdHJpeFs0LDFdK2N4cl9CLlI1X3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhbNCwyXStjeHJfQi5SNV93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmBgYAoKIyMjIyMgQ2FkbWl1bQoKYGBge3J9CiMgbW9kaWZ5aW5nIGRhdGEgZnJhbWUgdG8gZml0IHRoZSB0eXBlIG9mIHNldHVwIHRoYXQgaXMgbmVlZCBmb3IgQ1hSCkNYUl9CX0NkPC1zdWJzZXQoY2EsIEVudj09IkNkIilbLGMoIlJlcCIsICJGb2NhbFNSIiwgIkNvbXBTUiIsICJEZW5zIiwgIlRlRmVtYWxlcyIsICJUdUZlbWFsZXMiKV0KCkNYUl9CX0NkJEZvY2FsPC1tYXB2YWx1ZXMoQ1hSX0JfQ2QkRm9jYWxTUiwgYygxLDIsNCw1KSwgYygiU1IxIiwgIlNSMiIsIlNSNCIsIlNSNSIpKQpDWFJfQl9DZCRDb21wU1IyPC1tYXB2YWx1ZXMoQ1hSX0JfQ2QkQ29tcFNSLCBjKDEsMiw0LDUpLCBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikpCgpDWFJfQl9DZCRDb21wPC1zYXBwbHkoYygxOmxlbmd0aChDWFJfQl9DZFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgaWYoaXMubmEoQ1hSX0JfQ2QkQ29tcFNSMlt4XSkpewogICAgYTwtIENYUl9CX0NkJEZvY2FsW3hdCiAgfWVsc2V7CiAgICBhPC1DWFJfQl9DZCRDb21wU1IyW3hdCiAgfQogIAogIGEKfSkKCmF1eDwtZGF0YS5mcmFtZShTUjE9cmVwKDAsIGxlbmd0aChDWFJfQl9DZFssMV0pKSwgU1IyPXJlcCgwLCBsZW5ndGgoQ1hSX0JfQ2RbLDFdKSksIFNSND1yZXAoMCwgbGVuZ3RoKENYUl9CX0NkWywxXSkpLCBTUjU9cmVwKDAsIGxlbmd0aChDWFJfQl9DZFssMV0pKSkKCmZvcihpIGluIDE6bGVuZ3RoKENYUl9CX0NkWywxXSkpewogICNjb2x1bmEgb25kZSBwb3IgZm9jYWlzCiAgY29sdW5hRjwtd2hpY2goY29sbmFtZXMoYXV4KT09Q1hSX0JfQ2QkRm9jYWxbaV0pCiAgI2NvbHVuYSBvbmRlIHBvciBjb21wZXRpZG9ycwogIGNvbHVuYUM8LXdoaWNoKGNvbG5hbWVzKGF1eCk9PUNYUl9CX0NkJENvbXBbaV0pCiAgCiAgI2lmIGl0cyB0aGUgc2FtZSByZWdpbWUKICBpZihDWFJfQl9DZCRGb2NhbFtpXT09Q1hSX0JfQ2QkQ29tcFtpXSAmIENYUl9CX0NkJERlbnNbaV09PTEpewogICAgYXV4W2ksY29sdW5hRl08LUNYUl9CX0NkJERlbnNbaV0tMQogICAgCiAgfWVsc2UgaWYoQ1hSX0JfQ2QkRm9jYWxbaV09PUNYUl9CX0NkJENvbXBbaV0pewogICAgYXV4W2ksY29sdW5hRl08LUNYUl9CX0NkJERlbnNbaV0tMQogIH1lbHNleyAjaWYgaXQgaXMgaGV0ZXJvc3BlY2lmaWMgdGhlbiBpdHMgLTEgZm9yIHRoZSBjb21wZXRpdG9ycyAoYmVjYXVzZSBvZiB0aGUgZm9jYWwpIGFuZCBpdHMgb25lIGZvciB0aGUgZm9jYWwKICAgIGF1eFtpLGNvbHVuYUNdPC1DWFJfQl9DZCREZW5zW2ldLTEKICAgIGF1eFtpLCBjb2x1bmFGXTwtMQogIH0KICAKfQoKQ1hSX0JfQ2Q8LWNiaW5kKENYUl9CX0NkLCBhdXgpCgpDWFJfQl9DZCRmaXRuZXNzPC1zYXBwbHkoYygxOmxlbmd0aChDWFJfQl9DZFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgY29sRjwtd2hpY2goY29sbmFtZXMoQ1hSX0JfQ2QpPT1DWFJfQl9DZCRGb2NhbFt4XSkKICAKICBpZihDWFJfQl9DZCRGb2NhbFt4XT09IlNSMSIpewogICAgYTwtQ1hSX0JfQ2QkVHVGZW1hbGVzW3hdL0NYUl9CX0NkJFNSMVt4XQogIH0gZWxzZSBpZihDWFJfQl9DZCRGb2NhbFt4XT09IlNSMiIpewogICAgYTwtQ1hSX0JfQ2QkVHVGZW1hbGVzW3hdL0NYUl9CX0NkJFNSMlt4XQogIH0gZWxzZSBpZihDWFJfQl9DZCRGb2NhbFt4XT09IlNSNCIpewogICAgYTwtQ1hSX0JfQ2QkVGVGZW1hbGVzW3hdL0NYUl9CX0NkJFNSNFt4XQogIH0gZWxzZSBpZihDWFJfQl9DZCRGb2NhbFt4XT09IlNSNSIpewogICAgYTwtQ1hSX0JfQ2QkVGVGZW1hbGVzW3hdL0NYUl9CX0NkJFNSNVt4XQogIH0KICAKICBhCn0pCgojcmVtb3Zpbmcgcm93cyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gZGF0YSBmb3IgZml0bmVzcwojQ1hSX0JfQ2Q8LUNYUl9CX0NkWy13aGljaChpcy5uYShDWFJfQl9DZCRmaXRuZXNzKSksXQojQ1hSX0JfQ2QkZml0bmVzczwtQ1hSX0JfQ2QkZml0bmVzcysxCgpDWFJfQl9DZFt3aGljaChDWFJfQl9DZCRmaXRuZXNzPT0iLUluZiIgfCBDWFJfQl9DZCRmaXRuZXNzPT0iSW5mIiksImZpdG5lc3MiXTwtMAoKIzAgdG8gMSB0byBtYWlucmFpbiBkYXRhCkNYUl9CX0NkPC1DWFJfQl9DZFstd2hpY2goaXMubmEoQ1hSX0JfQ2QkZml0bmVzcykpLF0KQ1hSX0JfQ2QkZml0bmVzczwtQ1hSX0JfQ2QkZml0bmVzcysxCgoKCiMgdmVjdG9yIHRoYXQgdGVsbHMgd2hpY2ggYXJlIHRoZSBzZWxlY3Rpb24gcmVnaW1lcywgdGhlIGNvbHVtbnMgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIG5hbWUKbXkucmVnIDwtIGMoIlNSMSIsICJTUjIiLCJTUjQiLCJTUjUiKQoKIyBEbyBsaXN0IHBlciByZXBsaWNhdGUgYW5kIGVudmlyb25tZW50ClIxX0NkPC1saXN0KFNSMT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTEgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1IyPSBzdWJzZXQoQ1hSX0JfQ2QsIFJlcD09MSAmIEZvY2FsPT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQl9DZCwgUmVwPT0xICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSNT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTEgJiBGb2NhbD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSkKClIyX0NkPC1saXN0KFNSMT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTIgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQl9DZCwgUmVwPT0yICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSNT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTIgJiBGb2NhbD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSkKClIzX0NkPC1saXN0KFNSMT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTMgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1IyPSBzdWJzZXQoQ1hSX0JfQ2QsIFJlcD09MyAmIEZvY2FsPT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQl9DZCwgUmVwPT0zICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSNT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTMgJiBGb2NhbD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSkKClI0X0NkPC1saXN0KFNSMT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTQgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1IyPSBzdWJzZXQoQ1hSX0JfQ2QsIFJlcD09NCAmIEZvY2FsPT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQl9DZCwgUmVwPT00ICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSNT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTQgJiBGb2NhbD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSkKClI1X0NkPC1saXN0KFNSMT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTUgJiBGb2NhbD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSwgU1IyPSBzdWJzZXQoQ1hSX0JfQ2QsIFJlcD09NSAmIEZvY2FsPT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQl9DZCwgUmVwPT01ICYgRm9jYWw9PSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIiwgIlNSNCIsICJTUjUiKV0sIFNSNT0gc3Vic2V0KENYUl9CX0NkLCBSZXA9PTUgJiBGb2NhbD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiLCAiU1I0IiwgIlNSNSIpXSkKCmZpeGVkX3Rlcm1zXzFDZCA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09IkNkIiAmIFNSPT0xKSRsYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iQ2QiICYgU1I9PTIpJGxhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09IkNkIiAmIFNSPT00KSRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iQ2QiICYgU1I9PTUpJGxhbWJkYSkpCgpmaXhlZF90ZXJtc18yQ2QgPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTIgJiBFbnY9PSJDZCIgJiBTUj09MSkkbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MiAmIEVudj09IkNkIiAmIFNSPT00KSRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0yICYgRW52PT0iQ2QiICYgU1I9PTUpJGxhbWJkYSkpCgpmaXhlZF90ZXJtc18zQ2QgPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTMgJiBFbnY9PSJDZCIgJiBTUj09MSkkbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09IkNkIiAmIFNSPT0yKSRsYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTMgJiBFbnY9PSJDZCIgJiBTUj09NCkkbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09IkNkIiAmIFNSPT01KSRsYW1iZGEpKQoKZml4ZWRfdGVybXNfNENkIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT00ICYgRW52PT0iQ2QiICYgU1I9PTEpJGxhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJDZCIgJiBTUj09MikkbGFtYmRhKSwgIyBmb2NhbCBzcCAyCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT00ICYgRW52PT0iQ2QiICYgU1I9PTQpJGxhbWJkYSksCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGE9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJDZCIgJiBTUj09NSkkbGFtYmRhKSkKCmZpeGVkX3Rlcm1zXzVDZCA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09IkNkIiAmIFNSPT0xKSRsYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT01ICYgRW52PT0iQ2QiICYgU1I9PTIpJGxhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09IkNkIiAmIFNSPT00KSRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT01ICYgRW52PT0iQ2QiICYgU1I9PTUpJGxhbWJkYSkpCgpjeHJfQi5SMV9DZF93MDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSMV9DZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludHJhID0gMC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gZml4ZWRfdGVybXNfMUNkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCiMgcmVwbGljYXRlIDIgYmVsb3cKCgpjeHJfQi5SM19DZF93MDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSM19DZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzNDZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPTEwKQoKY3hyX0IuUjRfQ2RfdzA8LWN4cl9wbV9tdWx0aWZpdChkYXRhID0gUjRfQ2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IG15LnJlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJwYWlyd2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzRDZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpjeHJfQi5SNV9DZF93MDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSNV9DZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzVDZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpzdW1tYXJ5KGN4cl9CLlIxX0NkX3cwKQojc3VtbWFyeShjeHJfQi5SMl9DZF93MCkKc3VtbWFyeShjeHJfQi5SM19DZF93MCkKc3VtbWFyeShjeHJfQi5SNF9DZF93MCkKc3VtbWFyeShjeHJfQi5SNV9DZF93MCkKCiMjIyBGb3IgcmVwbGljYXRlIEkgY2FuJ3QgZmluZCBnb29kIGluaXRpYWwgY29uZGl0aW9ucywgbGV0cyBkbyB0aGlzIGJ5IGhhbmQKCiMgY3hyX0IuUjJfQ2RfdzA8LWN4cl9wbV9tdWx0aWZpdChkYXRhID0gUjJfQ2QsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnW2MoMSwzLDQpXSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiQkgiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChsYW1iZGEgPSAxLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9pbnRyYSA9IDAuMSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaW50ZXIgPSAwLjEpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBOVUxMLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPTEwKQoKIyBUaGlzIG9uZSB3b3JrcyB3ZWxsCmN4cl9CLlIyX0NkX3cwX3NyMTwtY3hyX3BtX2ZpdChkYXRhID0gUjJfQ2RbWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gbXkucmVnWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRyYSA9IDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzJDZFtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCiNmb3IgcmVwbGljYXRlIDIgd2Ugd2lsbCBkbyB0aGUgZml0dGluZyBieSBoYW5kIGJlY2F1c2Ugd2UgbWF5IG5lZWQgdG8gc2NhbGUgdGhlIHBhcmFtZXRlcnMKCmN4cl9CLlIyX0NkX3cwX3NyNDwtY3hyX3BtX2ZpdChkYXRhID0gUjJfQ2RbWzJdXVt3aGljaChSMl9DZFtbMl1dWywiU1IxIl09PTApLCBjKCJmaXRuZXNzIiwgIlNSNCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzJDZFtbMl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCiBjeHJfQi5SMl9DZF93MF81PC1jeHJfcG1fZml0KGRhdGEgPSBSMl9DZFtbM11dW3doaWNoKFIyX0NkW1szXV1bLCJTUjEiXT09MCksIGMoImZpdG5lc3MiLCAiU1I1IildLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QoYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gZml4ZWRfdGVybXNfMkNkW1szXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQogCgpjeHJfQi5SMl9DZF93MF9zcjRfaW50ZXI8LWN4cl9wbV9maXQoZGF0YSA9IFIyX0NkW1syXV1bd2hpY2goUjJfQ2RbWzJdXVssIlNSMSJdIT0wKSwgYygiZml0bmVzcyIsICJTUjEiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBmaXhlZF90ZXJtc18yQ2RbWzJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgogY3hyX0IuUjJfQ2RfdzBfc3I1X2ludGVyPC1jeHJfcG1fZml0KGRhdGEgPSBSMl9DZFtbM11dW3doaWNoKFIyX0NkW1szXV1bLCJTUjEiXSE9MCksIGMoImZpdG5lc3MiLCAiU1IxIildLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QoYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gZml4ZWRfdGVybXNfMkNkW1szXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQpgYGAKCgoKIyMjIyMjIGRhdGEgdGFibGUgc3VtbWFyeQoKYGBge3J9CgpjeHJfcGFyYW1fQkM8LWV4cGFuZC5ncmlkKFR1X1JlZ2ltZT1jKCJTUjEiLCAiU1IyIiksIFRlX1JlZ2ltZT1jKCJTUjQiLCAiU1I1IiksIFJlcGxpY2F0ZT1jKDEsMiwzLDQsNSksIEVudmlyb25tZW50PWMoIkNkIikpCmN4cl9wYXJhbV9CQyRUdV9sYW1iZGE8LTAKY3hyX3BhcmFtX0JDJFRlX2xhbWJkYTwtMApjeHJfcGFyYW1fQkMkVHVfaW50cmE8LTAKY3hyX3BhcmFtX0JDJFRlX2ludHJhPC0wCmN4cl9wYXJhbV9CQyRUdV9pbnRlcjwtMApjeHJfcGFyYW1fQkMkVGVfaW50ZXI8LTAKCiNyZW1vdmluZyBTUjIgZm9yIHJlcGxpY2F0ZSAyCmN4cl9wYXJhbV9CQzwtY3hyX3BhcmFtX0JDWy13aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT0yICYgY3hyX3BhcmFtX0JDJFR1X1JlZ2ltZT09IlNSMiIpLF0KCgpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09MSksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlIxX0NkX3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLGN4cl9CLlIxX0NkX3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09MSksIlRlX2xhbWJkYSJdPC1jKGN4cl9CLlIxX0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLGN4cl9CLlIxX0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLCBjeHJfQi5SMV9DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSxjeHJfQi5SMV9DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT0yKSwiVHVfbGFtYmRhIl08LWN4cl9CLlIyX0NkX3cwX3NyMSRmaXhlZF90ZXJtcyRsYW1iZGEKY3hyX3BhcmFtX0JDW3doaWNoKGN4cl9wYXJhbV9CQyRSZXBsaWNhdGU9PTIpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SMl9DZF93MF9zcjQkZml4ZWRfdGVybXMkbGFtYmRhLCBjeHJfQi5SMl9DZF93MF81JGZpeGVkX3Rlcm1zJGxhbWJkYSkKCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT0zKSwiVHVfbGFtYmRhIl08LWMoY3hyX0IuUjNfQ2RfdzAkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEsY3hyX0IuUjNfQ2RfdzAkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT0zKSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjNfQ2RfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEsY3hyX0IuUjNfQ2RfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEsIGN4cl9CLlIzX0NkX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLGN4cl9CLlIzX0NkX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0JDW3doaWNoKGN4cl9wYXJhbV9CQyRSZXBsaWNhdGU9PTQpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SNF9DZF93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYSxjeHJfQi5SNF9DZF93MCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0JDW3doaWNoKGN4cl9wYXJhbV9CQyRSZXBsaWNhdGU9PTQpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SNF9DZF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSxjeHJfQi5SNF9DZF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSwgY3hyX0IuUjRfQ2RfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEsY3hyX0IuUjRfQ2RfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09NSksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlI1X0NkX3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLGN4cl9CLlI1X0NkX3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09NSksIlRlX2xhbWJkYSJdPC1jKGN4cl9CLlI1X0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLGN4cl9CLlI1X0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLCBjeHJfQi5SNV9DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSxjeHJfQi5SNV9DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSkKCgpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09MSksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFsxLDFdLCBjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMiwyXSksIDIpCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzMsM10sIGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0JDW3doaWNoKGN4cl9wYXJhbV9CQyRSZXBsaWNhdGU9PTIpLCJUdV9pbnRyYSJdPC1jeHJfQi5SMl9DZF93MF9zcjEkYWxwaGFfaW50cmEKY3hyX3BhcmFtX0JDW3doaWNoKGN4cl9wYXJhbV9CQyRSZXBsaWNhdGU9PTIpLCJUZV9pbnRyYSJdPC1jKGN4cl9CLlIyX0NkX3cwX3NyNCRhbHBoYV9pbnRlcixjeHJfQi5SMl9DZF93MF9zcjVfaW50ZXIkYWxwaGFfaW50ZXIpCiAgCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT0zKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFsyLDJdKSwgMikKY3hyX3BhcmFtX0JDW3doaWNoKGN4cl9wYXJhbV9CQyRSZXBsaWNhdGU9PTMpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbMywzXSwgY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzQsNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09NCksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFsxLDFdLCBjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMiwyXSksIDIpCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT00KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzMsM10sIGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFs0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0JDW3doaWNoKGN4cl9wYXJhbV9CQyRSZXBsaWNhdGU9PTUpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMSwxXSwgY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzIsMl0pLCAyKQpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09NSksIlRlX2ludHJhIl08LXJlcChjKGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFszLDNdLCBjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbNCw0XSksIGVhY2g9MikKCgpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09MSksIlR1X2ludGVyIl08LWMoY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzEsM10sIGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFsyLDNdLGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFsxLDRdLCBjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX0JDW3doaWNoKGN4cl9wYXJhbV9CQyRSZXBsaWNhdGU9PTEpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFszLDFdLCBjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMywyXSxjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbNCwxXSwgY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0pCgpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09MiksIlR1X2ludGVyIl08LWN4cl9CLlIyX0NkX3cwX3NyMSRhbHBoYV9pbnRlclsyOjNdCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT0yKSwiVGVfaW50ZXIiXTwtYyhjeHJfQi5SMl9DZF93MF9zcjRfaW50ZXIkYWxwaGFfaW50ZXIsIGN4cl9CLlIyX0NkX3cwX3NyNV9pbnRlciRhbHBoYV9pbnRlcikKCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT0zKSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbMSwzXSwgY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzIsM10sY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0sIGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFsyLDRdKQpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09MyksIlRlX2ludGVyIl08LWMoY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFszLDJdLGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLCBjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbNCwyXSkKCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT00KSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMSwzXSwgY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzIsM10sY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0sIGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFsyLDRdKQpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09NCksIlRlX2ludGVyIl08LWMoY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFszLDJdLGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLCBjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbNCwyXSkKCmN4cl9wYXJhbV9CQ1t3aGljaChjeHJfcGFyYW1fQkMkUmVwbGljYXRlPT01KSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMSwzXSwgY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzIsM10sY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0sIGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFsyLDRdKQpjeHJfcGFyYW1fQkNbd2hpY2goY3hyX3BhcmFtX0JDJFJlcGxpY2F0ZT09NSksIlRlX2ludGVyIl08LWMoY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFszLDJdLGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLCBjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbNCwyXSkKCiMjIyBMb3dlcgoKY3hyX3BhcmFtX0JDX2xvd2VyPC1leHBhbmQuZ3JpZChUdV9SZWdpbWU9YygiU1IxIiwgIlNSMiIpLCBUZV9SZWdpbWU9YygiU1I0IiwgIlNSNSIpLCBSZXBsaWNhdGU9YygxLDIsMyw0LDUpLCBFbnZpcm9ubWVudD1jKCJDZCIpKQpjeHJfcGFyYW1fQkNfbG93ZXIkVHVfbGFtYmRhPC0wCmN4cl9wYXJhbV9CQ19sb3dlciRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX0JDX2xvd2VyJFR1X2ludHJhPC0wCmN4cl9wYXJhbV9CQ19sb3dlciRUZV9pbnRyYTwtMApjeHJfcGFyYW1fQkNfbG93ZXIkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX0JDX2xvd2VyJFRlX2ludGVyPC0wCgojcmVtb3ZpbmcgU1IyIGZvciByZXBsaWNhdGUgMgpjeHJfcGFyYW1fQkNfbG93ZXI8LWN4cl9wYXJhbV9CQ19sb3dlclstd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09MiAmIGN4cl9wYXJhbV9CQ19sb3dlciRUdV9SZWdpbWU9PSJTUjIiKSxdCgojU2luY2UgdGhlIGVycm9yIGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlIGRhdGEgd2UgbmVlZCB0byBjcmVhdGUgc29tZSBsaXN0cyB3aXRoIHRoYXQgaW5mb3JtYXRpb24Kc2RfMUMgPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTEgJiBFbnY9PSJDZCIgJiBTUj09MSkkc2RfbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09IkNkIiAmIFNSPT0yKSRzZF9sYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTEgJiBFbnY9PSJDZCIgJiBTUj09NCkkc2RfbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09IkNkIiAmIFNSPT01KSRzZF9sYW1iZGEpKQoKc2RfMkMgPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTIgJiBFbnY9PSJDZCIgJiBTUj09MSkkc2RfbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MiAmIEVudj09IkNkIiAmIFNSPT00KSRzZF9sYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0yICYgRW52PT0iQ2QiICYgU1I9PTUpJHNkX2xhbWJkYSkpCgpzZF8zQyA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09IkNkIiAmIFNSPT0xKSRzZF9sYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0zICYgRW52PT0iQ2QiICYgU1I9PTIpJHNkX2xhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09IkNkIiAmIFNSPT00KSRzZF9sYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0zICYgRW52PT0iQ2QiICYgU1I9PTUpJHNkX2xhbWJkYSkpCgpzZF80QyA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NCAmIEVudj09IkNkIiAmIFNSPT0xKSRzZF9sYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT00ICYgRW52PT0iQ2QiICYgU1I9PTIpJHNkX2xhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NCAmIEVudj09IkNkIiAmIFNSPT00KSRzZF9sYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT00ICYgRW52PT0iQ2QiICYgU1I9PTUpJHNkX2xhbWJkYSkpCgpzZF81QyA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09IkNkIiAmIFNSPT0xKSRzZF9sYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT01ICYgRW52PT0iQ2QiICYgU1I9PTIpJHNkX2xhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09IkNkIiAmIFNSPT00KSRzZF9sYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT01ICYgRW52PT0iQ2QiICYgU1I9PTUpJHNkX2xhbWJkYSkpCgpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09MSksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlIxX0NkX3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLXNkXzFDW1sxXV0kbGFtYmRhLGN4cl9CLlIxX0NkX3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhLXNkXzFDW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09MSksIlRlX2xhbWJkYSJdPC1jKGN4cl9CLlIxX0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzFDW1szXV0kbGFtYmRhLGN4cl9CLlIxX0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzFDW1szXV0kbGFtYmRhLCBjeHJfQi5SMV9DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF8xQ1tbNF1dJGxhbWJkYSxjeHJfQi5SMV9DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF8xQ1tbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT0yKSwiVHVfbGFtYmRhIl08LWN4cl9CLlIyX0NkX3cwX3NyMSRmaXhlZF90ZXJtcyRsYW1iZGEtc2RfMkNbWzFdXSRsYW1iZGEKY3hyX3BhcmFtX0JDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SMl9DZF93MF9zcjQkZml4ZWRfdGVybXMkbGFtYmRhLXNkXzJDW1syXV0kbGFtYmRhLCBjeHJfQi5SMl9DZF93MF81JGZpeGVkX3Rlcm1zJGxhbWJkYS1zZF8yQ1tbM11dJGxhbWJkYSkKCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT0zKSwiVHVfbGFtYmRhIl08LWMoY3hyX0IuUjNfQ2RfdzAkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEtc2RfM0NbWzFdXSRsYW1iZGEsY3hyX0IuUjNfQ2RfdzAkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEtc2RfM0NbWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT0zKSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjNfQ2RfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfM0NbWzNdXSRsYW1iZGEsY3hyX0IuUjNfQ2RfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfM0NbWzNdXSRsYW1iZGEsIGN4cl9CLlIzX0NkX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzNDW1s0XV0kbGFtYmRhLGN4cl9CLlIzX0NkX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzNDW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0JDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CQ19sb3dlciRSZXBsaWNhdGU9PTQpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SNF9DZF93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYS1zZF80Q1tbMV1dJGxhbWJkYSxjeHJfQi5SNF9DZF93MCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYS1zZF80Q1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0JDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CQ19sb3dlciRSZXBsaWNhdGU9PTQpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SNF9DZF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF80Q1tbM11dJGxhbWJkYSxjeHJfQi5SNF9DZF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF80Q1tbM11dJGxhbWJkYSwgY3hyX0IuUjRfQ2RfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfNENbWzRdXSRsYW1iZGEsY3hyX0IuUjRfQ2RfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfNENbWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09NSksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlI1X0NkX3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLXNkXzVDW1sxXV0kbGFtYmRhLGN4cl9CLlI1X0NkX3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhLXNkXzVDW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09NSksIlRlX2xhbWJkYSJdPC1jKGN4cl9CLlI1X0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzVDW1szXV0kbGFtYmRhLGN4cl9CLlI1X0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzVDW1szXV0kbGFtYmRhLCBjeHJfQi5SNV9DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF81Q1tbNF1dJGxhbWJkYSxjeHJfQi5SNV9DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF81Q1tbNF1dJGxhbWJkYSkKCgpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09MSksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFsxLDFdLWN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMiwyXS1jeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSksIDIpCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzMsM10tY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsM10sIGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFs0LDRdLWN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0JDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUdV9pbnRyYSJdPC1jeHJfQi5SMl9DZF93MF9zcjEkYWxwaGFfaW50cmFbMV0tY3hyX0IuUjJfQ2RfdzBfc3IxJGFscGhhX2ludHJhX3N0YW5kYXJkX2Vycm9yWzFdCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT0yKSwiVGVfaW50cmEiXTwtYyhjeHJfQi5SMl9DZF93MF9zcjQkYWxwaGFfaW50ZXJbMV0tY3hyX0IuUjJfQ2RfdzBfc3I0JGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yWzFdLCBjeHJfQi5SMl9DZF93MF81JGFscGhhX2ludGVyWzFdLWN4cl9CLlIyX0NkX3cwXzUkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMV0pCgpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09MyksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFsxLDFdLWN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbMiwyXS1jeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSksIDIpCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT0zKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzMsM10tY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsM10sIGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFs0LDRdLWN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0JDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CQ19sb3dlciRSZXBsaWNhdGU9PTQpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMSwxXS1jeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzIsMl0tY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09NCksIlRlX2ludHJhIl08LXJlcChjKGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFszLDNdLWN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbNCw0XS1jeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT01KSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzEsMV0tY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFsyLDJdLWN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX0JDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CQ19sb3dlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMywzXS1jeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywzXSwgY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzQsNF0tY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsNF0pLCBlYWNoPTIpCgoKY3hyX3BhcmFtX0JDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9pbnRlciJdPC1jKGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFsxLDNdLWN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMiwzXS1jeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMSw0XS1jeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzIsNF0tY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT0xKSwiVGVfaW50ZXIiXTwtYyhjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMywxXS1jeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMl0tY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMV0tY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFs0LDJdLWN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX0JDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9CQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUdV9pbnRlciJdPC1jeHJfQi5SMl9DZF93MF9zcjEkYWxwaGFfaW50ZXJbMjozXS1jeHJfQi5SMl9DZF93MF9zcjEkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMjozXQpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09MiksIlRlX2ludGVyIl08LWMoY3hyX0IuUjJfQ2RfdzBfc3I0X2ludGVyJGFscGhhX2ludGVyWzFdLWN4cl9CLlIyX0NkX3cwX3NyNF9pbnRlciRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvclsxXSwgY3hyX0IuUjJfQ2RfdzBfc3I1X2ludGVyJGFscGhhX2ludGVyWzFdLWN4cl9CLlIyX0NkX3cwX3NyNV9pbnRlciRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvclsxXSkKCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT0zKSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbMSwzXS1jeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzIsM10tY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0tY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFsyLDRdLWN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09MyksIlRlX2ludGVyIl08LWMoY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFszLDJdLWN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLWN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbNCwyXS1jeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT00KSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMSwzXS1jeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzIsM10tY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0tY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFsyLDRdLWN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09NCksIlRlX2ludGVyIl08LWMoY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFszLDJdLWN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLWN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbNCwyXS1jeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV9CQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQkNfbG93ZXIkUmVwbGljYXRlPT01KSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMSwzXS1jeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzIsM10tY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0tY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFsyLDRdLWN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fQkNfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0JDX2xvd2VyJFJlcGxpY2F0ZT09NSksIlRlX2ludGVyIl08LWMoY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFszLDJdLWN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFs0LDFdLWN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbNCwyXS1jeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCiMjIyB1cHBlcgoKY3hyX3BhcmFtX0JDX3VwcGVyPC1leHBhbmQuZ3JpZChUdV9SZWdpbWU9YygiU1IxIiwgIlNSMiIpLCBUZV9SZWdpbWU9YygiU1I0IiwgIlNSNSIpLCBSZXBsaWNhdGU9YygxLDIsMyw0LDUpLCBFbnZpcm9ubWVudD1jKCJDZCIpKQpjeHJfcGFyYW1fQkNfdXBwZXIkVHVfbGFtYmRhPC0wCmN4cl9wYXJhbV9CQ191cHBlciRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX0JDX3VwcGVyJFR1X2ludHJhPC0wCmN4cl9wYXJhbV9CQ191cHBlciRUZV9pbnRyYTwtMApjeHJfcGFyYW1fQkNfdXBwZXIkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX0JDX3VwcGVyJFRlX2ludGVyPC0wCgojcmVtb3ZpbmcgU1IyIGZvciByZXBsaWNhdGUgMgpjeHJfcGFyYW1fQkNfdXBwZXI8LWN4cl9wYXJhbV9CQ191cHBlclstd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09MiAmIGN4cl9wYXJhbV9CQ191cHBlciRUdV9SZWdpbWU9PSJTUjIiKSxdCgoKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTEpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SMV9DZF93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYStzZF8xQ1tbMV1dJGxhbWJkYSxjeHJfQi5SMV9DZF93MCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYStzZF8xQ1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTEpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SMV9DZF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF8xQ1tbM11dJGxhbWJkYSxjeHJfQi5SMV9DZF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF8xQ1tbM11dJGxhbWJkYSwgY3hyX0IuUjFfQ2RfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfMUNbWzRdXSRsYW1iZGEsY3hyX0IuUjFfQ2RfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfMUNbWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09MiksIlR1X2xhbWJkYSJdPC1jeHJfQi5SMl9DZF93MF9zcjEkZml4ZWRfdGVybXMkbGFtYmRhK3NkXzJDW1sxXV0kbGFtYmRhCmN4cl9wYXJhbV9CQ191cHBlclt3aGljaChjeHJfcGFyYW1fQkNfdXBwZXIkUmVwbGljYXRlPT0yKSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjJfQ2RfdzBfc3I0JGZpeGVkX3Rlcm1zJGxhbWJkYStzZF8yQ1tbMl1dJGxhbWJkYSwgY3hyX0IuUjJfQ2RfdzBfNSRmaXhlZF90ZXJtcyRsYW1iZGErc2RfMkNbWzNdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09MyksIlR1X2xhbWJkYSJdPC1jKGN4cl9CLlIzX0NkX3cwJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhK3NkXzNDW1sxXV0kbGFtYmRhLGN4cl9CLlIzX0NkX3cwJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhK3NkXzNDW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09MyksIlRlX2xhbWJkYSJdPC1jKGN4cl9CLlIzX0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhK3NkXzNDW1szXV0kbGFtYmRhLGN4cl9CLlIzX0NkX3cwJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhK3NkXzNDW1szXV0kbGFtYmRhLCBjeHJfQi5SM19DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYStzZF8zQ1tbNF1dJGxhbWJkYSxjeHJfQi5SM19DZF93MCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYStzZF8zQ1tbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9CQ191cHBlclt3aGljaChjeHJfcGFyYW1fQkNfdXBwZXIkUmVwbGljYXRlPT00KSwiVHVfbGFtYmRhIl08LWMoY3hyX0IuUjRfQ2RfdzAkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGErc2RfNENbWzFdXSRsYW1iZGEsY3hyX0IuUjRfQ2RfdzAkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGErc2RfNENbWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9CQ191cHBlclt3aGljaChjeHJfcGFyYW1fQkNfdXBwZXIkUmVwbGljYXRlPT00KSwiVGVfbGFtYmRhIl08LWMoY3hyX0IuUjRfQ2RfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfNENbWzNdXSRsYW1iZGEsY3hyX0IuUjRfQ2RfdzAkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfNENbWzNdXSRsYW1iZGEsIGN4cl9CLlI0X0NkX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzRDW1s0XV0kbGFtYmRhLGN4cl9CLlI0X0NkX3cwJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzRDW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTUpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQi5SNV9DZF93MCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYStzZF81Q1tbMV1dJGxhbWJkYSxjeHJfQi5SNV9DZF93MCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYStzZF81Q1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTUpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQi5SNV9DZF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF81Q1tbM11dJGxhbWJkYSxjeHJfQi5SNV9DZF93MCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF81Q1tbM11dJGxhbWJkYSwgY3hyX0IuUjVfQ2RfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfNUNbWzRdXSRsYW1iZGEsY3hyX0IuUjVfQ2RfdzAkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfNUNbWzRdXSRsYW1iZGEpCgoKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTEpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMSwxXStjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzIsMl0rY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09MSksIlRlX2ludHJhIl08LXJlcChjKGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFszLDNdK2N4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbNCw0XStjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV9CQ191cHBlclt3aGljaChjeHJfcGFyYW1fQkNfdXBwZXIkUmVwbGljYXRlPT0yKSwiVHVfaW50cmEiXTwtY3hyX0IuUjJfQ2RfdzBfc3IxJGFscGhhX2ludHJhWzFdK2N4cl9CLlIyX0NkX3cwX3NyMSRhbHBoYV9pbnRyYV9zdGFuZGFyZF9lcnJvclsxXQpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09MiksIlRlX2ludHJhIl08LWMoY3hyX0IuUjJfQ2RfdzBfc3I0JGFscGhhX2ludGVyWzFdK2N4cl9CLlIyX0NkX3cwX3NyNCRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvclsxXSwgY3hyX0IuUjJfQ2RfdzBfNSRhbHBoYV9pbnRlclsxXStjeHJfQi5SMl9DZF93MF81JGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yWzFdKQoKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbMSwxXStjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzIsMl0rY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMl0pLCAyKQpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09MyksIlRlX2ludHJhIl08LXJlcChjKGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFszLDNdK2N4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDNdLCBjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbNCw0XStjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCw0XSksIGVhY2g9MikKCmN4cl9wYXJhbV9CQ191cHBlclt3aGljaChjeHJfcGFyYW1fQkNfdXBwZXIkUmVwbGljYXRlPT00KSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzEsMV0rY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFsyLDJdK2N4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDJdKSwgMikKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMywzXStjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywzXSwgY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzQsNF0rY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsNF0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09NSksIlR1X2ludHJhIl08LXJlcChjKGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFsxLDFdK2N4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMiwyXStjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwyXSksIDIpCmN4cl9wYXJhbV9CQ191cHBlclt3aGljaChjeHJfcGFyYW1fQkNfdXBwZXIkUmVwbGljYXRlPT01KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzMsM10rY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsM10sIGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFs0LDRdK2N4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDRdKSwgZWFjaD0yKQoKCmN4cl9wYXJhbV9CQ191cHBlclt3aGljaChjeHJfcGFyYW1fQkNfdXBwZXIkUmVwbGljYXRlPT0xKSwiVHVfaW50ZXIiXTwtYyhjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbMSwzXStjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzIsM10rY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzEsNF0rY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFsyLDRdK2N4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09MSksIlRlX2ludGVyIl08LWMoY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4WzMsMV0rY3hyX0IuUjFfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFszLDJdK2N4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeFs0LDFdK2N4cl9CLlIxX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhbNCwyXStjeHJfQi5SMV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV9CQ191cHBlclt3aGljaChjeHJfcGFyYW1fQkNfdXBwZXIkUmVwbGljYXRlPT0yKSwiVHVfaW50ZXIiXTwtY3hyX0IuUjJfQ2RfdzBfc3IxJGFscGhhX2ludGVyWzI6M10rY3hyX0IuUjJfQ2RfdzBfc3IxJGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yWzI6M10KY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlIyX0NkX3cwX3NyNF9pbnRlciRhbHBoYV9pbnRlclsxXStjeHJfQi5SMl9DZF93MF9zcjRfaW50ZXIkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMV0sIGN4cl9CLlIyX0NkX3cwX3NyNV9pbnRlciRhbHBoYV9pbnRlclsxXStjeHJfQi5SMl9DZF93MF9zcjVfaW50ZXIkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMV0pCgpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09MyksIlR1X2ludGVyIl08LWMoY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzEsM10rY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFsyLDNdK2N4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFsxLDRdK2N4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbMiw0XStjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeFszLDFdK2N4cl9CLlIzX0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbMywyXStjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQi5SM19DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0rY3hyX0IuUjNfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09NCksIlR1X2ludGVyIl08LWMoY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzEsM10rY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFsyLDNdK2N4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFsxLDRdK2N4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMiw0XStjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeFszLDFdK2N4cl9CLlI0X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbMywyXStjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQi5SNF9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0rY3hyX0IuUjRfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQkNfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0JDX3VwcGVyJFJlcGxpY2F0ZT09NSksIlR1X2ludGVyIl08LWMoY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzEsM10rY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFsyLDNdK2N4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFsxLDRdK2N4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMiw0XStjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0JDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9CQ191cHBlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRlciJdPC1jKGN4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeFszLDFdK2N4cl9CLlI1X0NkX3cwJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbMywyXStjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQi5SNV9DZF93MCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4WzQsMl0rY3hyX0IuUjVfQ2RfdzAkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpgYGAKCgojIyMjIyBqb2luaW5nIGRhdGEgZnJhbWUKCmBgYHtyfQoKcGFyYW1fYWxsX0I8LWFzLmRhdGEuZnJhbWUocmJpbmQoY3hyX3BhcmFtX0IsIGN4cl9wYXJhbV9CQykpCgpwYXJhbV9hbGxfQl9sb3dlcjwtYXMuZGF0YS5mcmFtZShyYmluZChjeHJfcGFyYW1fQl9sb3dlciwgY3hyX3BhcmFtX0JDX2xvd2VyKSkKcGFyYW1fYWxsX0JfdXBwZXI8LWFzLmRhdGEuZnJhbWUocmJpbmQoY3hyX3BhcmFtX0JfdXBwZXIsIGN4cl9wYXJhbV9CQ191cHBlcikpCgpwYXJhbV9hbGxfQl9sb3dlcgpwYXJhbV9hbGxfQl91cHBlcgoKd3JpdGUuY3N2KHBhcmFtX2FsbF9CLCAiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbWV0ZXJzX2N4cl9sYW1iZGFfZml4ZWQuY3N2IikKd3JpdGUuY3N2KHBhcmFtX2FsbF9CX3VwcGVyLCAiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbWV0ZXJzX2N4cl9sYW1iZGFfZml4ZWRfdXBwZXIuY3N2IikKd3JpdGUuY3N2KHBhcmFtX2FsbF9CX2xvd2VyLCAiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbWV0ZXJzX2N4cl9sYW1iZGFfZml4ZWRfbG93ZXIuY3N2IikKCmBgYAoKIyMjIyMgaW1wb3J0aW5nIGRhdGEgZnJhbWUKCmBgYHtyfQoKcGFyYW1fYWxsX0I8LXJlYWQuY3N2KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbG9nL3BhcmFtZXRlcnNfY3hyX2xhbWJkYV9maXhlZC5jc3YiKQpwYXJhbV9hbGxfQl91cHBlcjwtcmVhZC5jc3YoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9sb2cvcGFyYW1ldGVyc19jeHJfbGFtYmRhX2ZpeGVkX3VwcGVyLmNzdiIpCnBhcmFtX2FsbF9CX2xvd2VyPC1yZWFkLmNzdigiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbWV0ZXJzX2N4cl9sYW1iZGFfZml4ZWRfbG93ZXIuY3N2IikKCnBhcmFtX2FsbF9CPC1wYXJhbV9hbGxfQlssLTFdCnBhcmFtX2FsbF9CX3VwcGVyPC1wYXJhbV9hbGxfQl91cHBlclssLTFdCnBhcmFtX2FsbF9CX2xvd2VyPC1wYXJhbV9hbGxfQl9sb3dlclssLTFdCgpgYGAKCiMjIyMjIFBsb3R0aW5nIGRhdGEKCmBgYHtyfQoKcGFyYW1fYWxsX0JfbG9uZzwtZ2F0aGVyKHBhcmFtX2FsbF9CLCBwYXJhbWV0ZXIsIHZhbHVlLFR1X2xhbWJkYTpUZV9pbnRlciApCgpwYXJhbV9hbGxfQl9sb25nJGNhdGVnb3J5PC1tYXB2YWx1ZXMocGFyYW1fYWxsX0JfbG9uZyRwYXJhbWV0ZXIsIGMoIlR1X2xhbWJkYSIsICJUZV9sYW1iZGEiLCAiVHVfaW50cmEiLCAiVGVfaW50cmEiLCJUdV9pbnRlciIsICJUZV9pbnRlciIpLCBjKCJsYW1iZGEiLCAibGFtYmRhIiwgImludHJhIiwgImludHJhIiwgImludGVyIiwgImludGVyIikpCgpwYXJhbV9hbGxfQl9sb3dlcl9sb25nPC1nYXRoZXIocGFyYW1fYWxsX0JfbG93ZXIsIHBhcmFtZXRlciwgdmFsdWUsVHVfbGFtYmRhOlRlX2ludGVyICkKCnBhcmFtX2FsbF9CX2xvd2VyX2xvbmckY2F0ZWdvcnk8LW1hcHZhbHVlcyhwYXJhbV9hbGxfQl9sb3dlcl9sb25nJHBhcmFtZXRlciwgYygiVHVfbGFtYmRhIiwgIlRlX2xhbWJkYSIsICJUdV9pbnRyYSIsICJUZV9pbnRyYSIsIlR1X2ludGVyIiwgIlRlX2ludGVyIiksIGMoImxhbWJkYSIsICJsYW1iZGEiLCAiaW50cmEiLCAiaW50cmEiLCAiaW50ZXIiLCAiaW50ZXIiKSkKCnBhcmFtX2FsbF9CX3VwcGVyX2xvbmc8LWdhdGhlcihwYXJhbV9hbGxfQl91cHBlciwgcGFyYW1ldGVyLCB2YWx1ZSxUdV9sYW1iZGE6VGVfaW50ZXIgKQoKcGFyYW1fYWxsX0JfdXBwZXJfbG9uZyRjYXRlZ29yeTwtbWFwdmFsdWVzKHBhcmFtX2FsbF9CX3VwcGVyX2xvbmckcGFyYW1ldGVyLCBjKCJUdV9sYW1iZGEiLCAiVGVfbGFtYmRhIiwgIlR1X2ludHJhIiwgIlRlX2ludHJhIiwiVHVfaW50ZXIiLCAiVGVfaW50ZXIiKSwgYygibGFtYmRhIiwgImxhbWJkYSIsICJpbnRyYSIsICJpbnRyYSIsICJpbnRlciIsICJpbnRlciIpKQoKY29sbmFtZXMocGFyYW1fYWxsX0JfbG93ZXJfbG9uZylbNl08LSJsb3dlciIKY29sbmFtZXMocGFyYW1fYWxsX0JfdXBwZXJfbG9uZylbNl08LSJ1cHBlciIKCnN0cihwYXJhbV9hbGxfQl9sb25nKQoKcGFyYW1fYWxsX0JfbG9uZzwtY2JpbmQocGFyYW1fYWxsX0JfbG9uZ1ssMTo3XSxwYXJhbV9hbGxfQl9sb3dlcl9sb25nJGxvd2VyLCBwYXJhbV9hbGxfQl91cHBlcl9sb25nJHVwcGVyKQoKY29sbmFtZXMocGFyYW1fYWxsX0JfbG9uZylbODo5XTwtYygibG93ZXIiLCJ1cHBlciIpCgoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRyYSIgJiBUdV9SZWdpbWU9PSJTUjEiKSwgYWVzKHg9VGVfUmVnaW1lLCB5PXZhbHVlLCBmaWxsPUVudmlyb25tZW50KSkrCiAgZ2VvbV9ib3hwbG90KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSwgb3V0bGllci5hbHBoYSA9IDk5KSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkV2b2x2ZWQgXG53aXRob3V0IGNhZG1pdW0iLCAiRXZvbHZlZCBcbndpdGggY2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0Q1NUUwMCIsICIjMDA5RTczIiksIGxhYmVscz1jKCJXYXRlciIsICJDYWRtaXVtIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiNENTVFMDAiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiV2F0ZXIiLCAiQ2FkbWl1bSIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiU2VsZWN0aW9uIHJlZ2ltZSIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbV9SS19pbnRyYVRlX3cwX3JlcC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUdV9pbnRyYSIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9VHVfUmVnaW1lLCB5PXZhbHVlLCBmaWxsPUVudmlyb25tZW50KSkrCiAgZ2VvbV9ib3hwbG90KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBvdXRsaWVyLmFscGhhID0gOTkpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkV2b2x2ZWQgXG53aXRob3V0IGNhZG1pdW0iLCAiRXZvbHZlZCBcbndpdGggY2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0Q1NUUwMCIsICIjMDA5RTczIiksIGxhYmVscz1jKCJXYXRlciIsICJDYWRtaXVtIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiNENTVFMDAiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiV2F0ZXIiLCAiQ2FkbWl1bSIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9sb2cvcGFyYW1fUktfaW50cmFUdV93MF9yZXAucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCgoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRyYSIgJiBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIpLCBhZXMoeD1UZV9SZWdpbWUsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBvdXRsaWVyLmFscGhhID0gOTkpKwogIGdlb21fcG9pbnQoYWxwaGE9MC44NSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNENTVFMDAiLCAiIzAwOUU3MyIpKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJFdm9sdmVkIFxud2l0aG91dCBjYWRtaXVtIiwgIkV2b2x2ZWQgXG53aXRoIGNhZG1pdW0iKSkrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9sb2cvcGFyYW1fUktfaW50cmFUZV93MF9yZXBfZXZvbC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUdV9pbnRyYSIgJiBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJDZCIpLCBhZXMoeD1UdV9SZWdpbWUsIHk9dmFsdWUsIGZpbGw9VHVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSwgb3V0bGllci5hbHBoYSA9IDk5KSsKICBnZW9tX3BvaW50KGFscGhhPTAuODUsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkV2b2x2ZWQgXG53aXRob3V0IGNhZG1pdW0iLCAiRXZvbHZlZCBcbndpdGggY2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0Q1NUUwMCIsICIjMDA5RTczIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiNENTVFMDAiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiV2F0ZXIiLCAiQ2FkbWl1bSIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9sb2cvcGFyYW1fUktfaW50cmFUdV93MF9yZXBfZXZvbC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX0JfbG9uZywgcGFyYW1ldGVyPT0iVGVfaW50cmEiICYgVHVfUmVnaW1lPT0iU1IxIiksIGFlcyh4PUVudmlyb25tZW50LCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiSG9tb2dlbmVvdXMiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiSG9tb2dlbmVvdXMiKSkrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbG9nL3BhcmFtX1JLX2ludHJhVGVfdzBfcmVwX2Vudi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUdV9pbnRyYSIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PUVudmlyb25tZW50KSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSxsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiSG9tb2dlbmVvdXMiKSkrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gdXJ0aWNhZSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbV9SS19pbnRyYVR1X3cwX3JlcF9lbnYucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF9CX2xvbmcsIHBhcmFtZXRlcj09IlRlX2ludGVyIiksIGFlcyh4PUVudmlyb25tZW50LCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGZhY2V0X2dyaWQoVHVfUmVnaW1lfi4sIGxhYmVsbGVyPWxhYmVsbGVyKFR1X1JlZ2ltZT1yZWdpbWVUdSwgVGVfUmVnaW1lPXJlZ2ltZVRlKSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyPSJkYXJrZ3JheSIpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiSG9tb2dlbmVvdXMiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiSG9tb2dlbmVvdXMiKSkrCiAgeWxhYigiSW50ZXJzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbG9nL3BhcmFtX1JLX2ludGVyVGVfdzBfcmVwX2Vudi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUdV9pbnRlciIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9RW52aXJvbm1lbnQpKSsKICBmYWNldF9ncmlkKFRlX1JlZ2ltZX4uLCBsYWJlbGxlcj1sYWJlbGxlcihUdV9SZWdpbWU9cmVnaW1lVHUsIFRlX1JlZ2ltZT1yZWdpbWVUZSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91cj0iZGFya2dyYXkiKSsKICBnZW9tX2JveHBsb3Qob3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjc1KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkhvbW9nZW5lb3VzIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICB5bGFiKCJJbnRlcnNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbG9nL3BhcmFtX1JLX2ludGVyVHVfdzBfcmVwX2Vudi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX0JfbG9uZywgcGFyYW1ldGVyPT0iVGVfbGFtYmRhIiAmIFR1X1JlZ2ltZT09IlNSMSIpLCBhZXMoeD1FbnZpcm9ubWVudCwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBnZW9tX2JveHBsb3QoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICB5bGFiKCJJbnRyaW5zaWMgZ3Jvd3RoIHJhdGUgKFQuIGV2YW5zaSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbV9SS19sYW1iZGFUZV93MF9yZXBfZW52LnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF9CX2xvbmcsIHBhcmFtZXRlcj09IlR1X2xhbWJkYSIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PUVudmlyb25tZW50KSkrCiAgZ2VvbV9ib3hwbG90KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBvdXRsaWVyLmFscGhhID0wLjAxKSsKICBnZW9tX3BvaW50KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkhvbW9nZW5lb3VzIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJIb21vZ2VuZW91cyIpKSsKICB5bGFiKCJJbnRyaW5zaWMgZ3Jvd3RoIHJhdGUgKFQuIHVydGljYWUpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9sb2cvcGFyYW1fUktfbGFtYmRhVHVfdzBfcmVwX2Vudi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKCiMjIyMjIyMjIyMjCgoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRyYSIgJiBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIpLCBhZXMoeD1FbnZpcm9ubWVudCwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKSsKICB5bGltKGMoMC4wMywwLjI3KSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbG9nL3BhcmFtX1JLX2ludHJhVGVfdzBfcmVwX0NELnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF9CX2xvbmcsIHBhcmFtZXRlcj09IlRlX2ludHJhIiAmIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09Ik4iKSwgYWVzKHg9RW52aXJvbm1lbnQsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikrCiAgeWxpbShjKDAuMDMsMC4yNykpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbV9SS19pbnRyYVRlX3cwX3JlcF9OLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF9CX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludHJhIiAmIFRlX1JlZ2ltZT09IlNSNCIgJiBFbnZpcm9ubWVudD09IkNkIiksIGFlcyhmaWxsPVR1X1JlZ2ltZSwgeT12YWx1ZSwgeD1FbnZpcm9ubWVudCkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikrCiAgeWxpbShjKDAuMDMsMC4yNykpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbV9SS19pbnRyYVR1X3cwX3JlcF9DRC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUdV9pbnRyYSIgJiBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJOIiksIGFlcyhmaWxsPVR1X1JlZ2ltZSwgeT12YWx1ZSwgeD1FbnZpcm9ubWVudCkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikrCiAgeWxpbShjKDAuMDMsMC4yNykpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbV9SS19pbnRyYVR1X3cwX3JlcF9OLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRlciIgJiBFbnZpcm9ubWVudD09IkNkIiksIGFlcyh4PUVudmlyb25tZW50LCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGZhY2V0X2dyaWQoLn5UdV9SZWdpbWUsIGxhYmVsbGVyPWxhYmVsbGVyKFR1X1JlZ2ltZT1yZWdpbWVUdSwgVGVfUmVnaW1lPXJlZ2ltZVRlKSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyPSJkYXJrZ3JheSIpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludGVyc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIGV2YW5zaSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpKwogIHlsaW0oYygtMC4wNSwgMC4xNikpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbV9SS19pbnRlclRlX3cwX3JlcF9DZC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRlciIgJiBFbnZpcm9ubWVudD09Ik4iKSwgYWVzKHg9RW52aXJvbm1lbnQsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZmFjZXRfZ3JpZCguflR1X1JlZ2ltZSwgbGFiZWxsZXI9bGFiZWxsZXIoVHVfUmVnaW1lPXJlZ2ltZVR1LCBUZV9SZWdpbWU9cmVnaW1lVGUpKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXI9ImRhcmtncmF5IikrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50ZXJzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikrCiAgeWxpbShjKC0wLjA1LCAwLjE2KSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbG9nL3BhcmFtX1JLX2ludGVyVGVfdzBfcmVwX04ucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX0JfbG9uZywgcGFyYW1ldGVyPT0iVHVfaW50ZXIiICYgRW52aXJvbm1lbnQ9PSJDZCIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9RW52aXJvbm1lbnQpKSsKICBmYWNldF9ncmlkKC5+VGVfUmVnaW1lLCBsYWJlbGxlcj1sYWJlbGxlcihUdV9SZWdpbWU9cmVnaW1lVHUsIFRlX1JlZ2ltZT1yZWdpbWVUZSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91cj0iZGFya2dyYXkiKSsKICBnZW9tX2JveHBsb3Qob3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjc1KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50ZXJzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gdXJ0aWNhZSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpKwogIHlsaW0oYygtMC4wNSwgMC4xMikpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbV9SS19pbnRlclR1X3cwX3JlcF9DZC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUdV9pbnRlciIgJiBFbnZpcm9ubWVudD09Ik4iKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PUVudmlyb25tZW50KSkrCiAgZmFjZXRfZ3JpZCguflRlX1JlZ2ltZSwgbGFiZWxsZXI9bGFiZWxsZXIoVHVfUmVnaW1lPXJlZ2ltZVR1LCBUZV9SZWdpbWU9cmVnaW1lVGUpKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXI9ImRhcmtncmF5IikrCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC43NSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSxsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludGVyc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIHVydGljYWUpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKSsKICB5bGltKGMoLTAuMDUsIDAuMTIpKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9sb2cvcGFyYW1fUktfaW50ZXJUdV93MF9yZXBfTi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX0JfbG9uZywgcGFyYW1ldGVyPT0iVGVfbGFtYmRhIiAmIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09IkNkIiksIGFlcyh4PUVudmlyb25tZW50LCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmluc2ljIGdyb3d0aCByYXRlIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKSsKICB5bGltKGMoMCwgMykpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wYXJhbV9SS19sYW1iZGFUZV93MF9yZXBfQ0QucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX0JfbG9uZywgcGFyYW1ldGVyPT0iVGVfbGFtYmRhIiAmIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09Ik4iKSwgYWVzKHg9RW52aXJvbm1lbnQsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJpbnNpYyBncm93dGggcmF0ZSAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikrCiAgeWxpbShjKDAsIDgpKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9sb2cvcGFyYW1fUktfbGFtYmRhVGVfdzBfcmVwX04ucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX0JfbG9uZywgcGFyYW1ldGVyPT0iVHVfbGFtYmRhIiAmIFRlX1JlZ2ltZT09IlNSNCIgJiBFbnZpcm9ubWVudD09IkNkIiksIGFlcyhmaWxsPVR1X1JlZ2ltZSwgeT12YWx1ZSwgeD1FbnZpcm9ubWVudCkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSxsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJpbnNpYyBncm93dGggcmF0ZSAoVC4gdXJ0aWNhZSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpKwogIHlsaW0oYygwLCAzKSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbG9nL3BhcmFtX1JLX2xhbWJkYVR1X3cwX3JlcF9DRC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQl9sb25nLCBwYXJhbWV0ZXI9PSJUdV9sYW1iZGEiICYgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iTiIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9RW52aXJvbm1lbnQpKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSxsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJpbnNpYyBncm93dGggcmF0ZSAoVC4gdXJ0aWNhZSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpKwogIHlsaW0oYygwLCA4KSkKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbG9nL3BhcmFtX1JLX2xhbWJkYVR1X3cwX3JlcF9OLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgoKYGBgCgojIyMjIFByZWRpY3RpbmcgZGVuc2l0aWVzCgpgYGB7cn0KCmRlbnNpdHlfYXV4PC1zZXEoMCwgMTAsIGJ5PSgxMC8xMDApKQoKcHJlZF9kZl9jeHJfQjwtYXMuZGF0YS5mcmFtZShleHBhbmRfZ3JpZChEZW5zaXR5PWRlbnNpdHlfYXV4LCBUdV9SZWdpbWU9YygiU1IxIiwiU1IyIiksIFRlX1JlZ2ltZT1jKCJTUjQiLCJTUjUiKSwgUmVwbGljYXRlPWMoMTo1KSwgRW52aXJvbm1lbnQ9YygiTiIsICJDZCIpKSkKCnByZWRfZGZfY3hyX0IkVHVfbWVhbl9pbnRyYTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJfQlssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfQiwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVHVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0IsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUdV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX0IsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFR1X2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfY3hyX0IkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQiRUdV9tZWFuX2ludGVyPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9CWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9CLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQiwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQiwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfY3hyX0IkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKCnByZWRfZGZfY3hyX0IkVHVfaW50cmFfTDwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJfQlssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfQl9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVHVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0JfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUdV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX0JfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFR1X2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfY3hyX0IkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQiRUdV9pbnRlcl9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9CWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9CX2xvd2VyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQl9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQl9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfY3hyX0IkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQiRUdV9pbnRyYV9VPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9CWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9CX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQl91cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQl91cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9jeHJfQiREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX2N4cl9CJFR1X2ludGVyX1U8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfY3hyX0JbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX0JfdXBwZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF9CX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF9CX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUdV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9jeHJfQiREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX2N4cl9CJFRlX21lYW5faW50cmE8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfY3hyX0JbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX0IsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFRlX2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF9CLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF9CLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaSpwcmVkX2RmX2N4cl9CJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfY3hyX0IkVGVfbWVhbl9pbnRlcjwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJfQlssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfQiwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVGVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0IsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX0IsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipwcmVkX2RmX2N4cl9CJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfY3hyX0IkVGVfaW50cmFfTDwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJfQlssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfQl9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVGVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0JfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX0JfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfY3hyX0IkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQiRUZV9pbnRlcl9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9CWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9CX2xvd2VyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQl9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQl9sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVGVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfY3hyX0IkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQiRUZV9pbnRyYV9VPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9CWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9CX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQl91cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQl91cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0IkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVGVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9jeHJfQiREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX2N4cl9CJFRlX2ludGVyX1U8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfY3hyX0JbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX0JfdXBwZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9CJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9CJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQiRSZXBsaWNhdGVbeF0pJFRlX2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF9CX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0IkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9CJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF9CX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQiRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQiRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0IkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9jeHJfQiREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgojIFJlbW92aW5nIFR1IGV2b2x2ZWQgcmVwbGljYXRlIDIgYmVjYXVzZSB0aGVyZSBpcyBubyBkYXRhCnByZWRfZGZfY3hyX0I8LXByZWRfZGZfY3hyX0JbLXdoaWNoKHByZWRfZGZfY3hyX0IkVHVfUmVnaW1lPT0iU1IyIiAmIHByZWRfZGZfY3hyX0IkUmVwbGljYXRlPT0yKSxdCgoKCiMgVHJhbnNmb3JtaW5nIGV2ZXJ5dGhpbmcgYmVsbG93IDAgaW50byAwIGZvciB0aGUgbG93ZXIgaW50ZXJ2YWwKCnByZWRfZGZfY3hyX0IkVGVfaW50ZXJfTFt3aGljaChwcmVkX2RmX2N4cl9CJFRlX2ludGVyX0w8MCldPC0wCnByZWRfZGZfY3hyX0IkVGVfaW50cmFfTFt3aGljaChwcmVkX2RmX2N4cl9CJFRlX2ludHJhX0w8MCldPC0wCnByZWRfZGZfY3hyX0IkVHVfaW50ZXJfTFt3aGljaChwcmVkX2RmX2N4cl9CJFR1X2ludGVyX0w8MCldPC0wCnByZWRfZGZfY3hyX0IkVHVfaW50cmFfTFt3aGljaChwcmVkX2RmX2N4cl9CJFR1X2ludHJhX0w8MCldPC0wCgoKYGBgCgpgYGB7cn0KZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MSAmIEVudj09Ik4iICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIlR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiBULiB1cnRpY2FlIikrCiAgZ2d0aXRsZSgiVHUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQpgYGAKCgojIyMjIFBsb3R0aW5nIHByZWRpY3Rpb25zCgojIyMjIyBDT05UUk9MIElOVFJBCgpgYGB7cn0KY2EkUmVwbGljYXRlPC1hcy5jaGFyYWN0ZXIoY2EkUmVwKQoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MSAmIEVudj09Ik4iICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMtMSwgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiBULiB1cnRpY2FlIikrCiAgZ2d0aXRsZSgiVHUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9sb2cvcHJlZF9UdV9JTlRSQV9Db250cm9sX3dhdGVyLnBkZiIsIHdpZHRoPTI1LCBoZWlnaHQ9MTApCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucy0xLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICAgIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIlR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbG9nL3ByZWRfVHVfSU5UUkFfQ29udHJvbF9jYWRtaXVtLnBkZiIsIHdpZHRoPTI1LCBoZWlnaHQ9MTApCgojc3Vic2V0KHByZWRfZGZfY3hyX0IsIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09IkNkIiAmIFJlcGxpY2F0ZT09MykKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFRlX1JlZ2ltZT09IlNSNCIgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50cmFfTCwgeW1heD1UZV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLTEsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogICAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiBULiBldmFuc2kiKSsKICBnZ3RpdGxlKCJUZSBjb250cm9sIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX2xvZy9wcmVkX1RlX0lOVFJBX0NvbnRyb2xfY29udHJvbC5wZGYiLCB3aWR0aD0yNSwgaGVpZ2h0PTEwKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJDZCIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRyYV9MLCB5bWF4PVRlX2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJDZCIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucy0xLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICAgIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gVC4gZXZhbnNpIikrCiAgZ2d0aXRsZSgiVGUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9sb2cvcHJlZF9UZV9JTlRSQV9Db250cm9sX2NhZG1pdW0ucGRmIiwgd2lkdGg9MjUsIGhlaWdodD0xMCkKCmBgYAoKIyMjIyMgQ09OVFJPTCBJTlRFUiB2cyBjb250cm9sCgpgYGB7cn0KZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09IlNSNCIpLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MSAmIEVudj09Ik4iICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09NCksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlR1ICYgVGUgY29udHJvbCBpbnRlcnNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgJiBUZSBjb250cm9sIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iTiIgJiBUdV9SZWdpbWU9PSJTUjEiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09IlNSMSIpLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NCAmIEVudj09Ik4iICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlICAmIFR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUdV9SZWdpbWU9PSJTUjEiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUdV9SZWdpbWU9PSJTUjEiKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0xKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgJiBUdSBjb250cm9sIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCiMjIyMjIENPTlRST0wgSU5URVIgdnMgZXZvbHZlZAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT0iU1I1IiksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50ZXJfTCwgeW1heD1UdV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTUpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBjb250cm9sICYgVGUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT01KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgY29udHJvbCAmIFRlIGV2b2x2ZWQgaW50ZXJzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09IlNSMiIpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFRlX1JlZ2ltZT09IlNSNCIgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT00ICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0yKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgY29udHJvbCAgJiBUdSBldm9sdmVkIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogICAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT00ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGNvbnRyb2wgICYgVHUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKYGBgCgojIyMjIyBDT05UUk9MIElOVFJBIGV2b2x2ZWQKCmBgYHtyfQpjYSRSZXBsaWNhdGU8LWFzLmNoYXJhY3RlcihjYSRSZXApCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludHJhX0wsIHltYXg9VHVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFR1X1JlZ2ltZT09IlNSMiIgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0yICYgRW52PT0iTiIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCBpbnRyYXNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVHVfUmVnaW1lPT0iU1IyIiAmIEVudmlyb25tZW50PT0iQ2QiICksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50cmFfTCwgeW1heD1UdV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVHVfUmVnaW1lPT0iU1IyIiAmIEVudmlyb25tZW50PT0iQ2QiICksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0yICYgRW52PT0iQ2QiICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlR1IGV2b2x2ZWQgaW50cmFzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50cmFfTCwgeW1heD1UZV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTUgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUZSBldm9sdmVkIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09IkNkIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludHJhX0wsIHltYXg9VGVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09IkNkIiApLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NSAmIEVudj09IkNkIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUZSBldm9sdmVkIGludHJhc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCiMjIyMjIEV2b2x2ZWQgSU5URVIgdnMgY29udHJvbAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFR1X1JlZ2ltZT09IlNSMiIgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT0iU1I0IiksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50ZXJfTCwgeW1heD1UdV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVHVfUmVnaW1lPT0iU1IyIiAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTQpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBldm9sdmVkICYgVGUgY29udHJvbCBpbnRlcnNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCAmIFRlIGNvbnRyb2wgaW50ZXJzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUZV9SZWdpbWU9PSJTUjUiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09IlNSMSIpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0iU1IxIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0xKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgZXZvbHZlZCAgJiBUdSBjb250cm9sIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogICAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IxIiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IxIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgJiBUdSBjb250cm9sIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCiMjIyMjIGV2b2x2ZWQgSU5URVIgdnMgZXZvbHZlZAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFR1X1JlZ2ltZT09IlNSMiIgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT0iU1I1IiksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50ZXJfTCwgeW1heD1UdV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVHVfUmVnaW1lPT0iU1IyIiAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTUpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBldm9sdmVkICYgVGUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT01KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCAmIFRlIGV2b2x2ZWQgaW50ZXJzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9CLCBUZV9SZWdpbWU9PSJTUjUiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09IlNSMiIpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0IsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0yKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgZXZvbHZlZCAgJiBUdSBldm9sdmVkIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogICAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQiwgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgICYgVHUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKYGBgCgojIyMjIyBQcmVkaWN0ZWQgdnMgb2JzZXJ2ZWQKCmBgYHtyfQoKc3RyKHBhcmFtX2FsbF9CKQoKc3RyKGNhKQoKcmtfZnVuYzwtIGZ1bmN0aW9uKGxhbWJkYSwgYWxwaGFfaWksIGFscGhhX2lqLCBkZW5zX2ksIGRlbnNfaiwgLi4uKXsKICBncjwtbGFtYmRhKmV4cCgtYWxwaGFfaWkqZGVuc19pIC0gYWxwaGFfaWoqZGVuc19qKQogIAogIHJldHVybihncikKfQoKcmVkX2NhX0I8LWNhWyxjKCJFbnYiLCAiUmVwIiwgIkZvY2FsU1IiLCAiQ29tcFNSIiwgIkRlbnMiLCAiVHlwZSIsICJUZUZlbWFsZXMiLCAiVHVGZW1hbGVzIiwgIkdyb3d0aFJhdGVPQSIpXQoKcmVkX2NhX0IKCnJlZF9jYV9CJERlbnNfRm9jYWw8LXNhcHBseShjKDE6bGVuZ3RoKHJlZF9jYV9CWywxXSkpLCBmdW5jdGlvbih4KXsKICBpZihyZWRfY2FfQiRUeXBlW3hdPT0iSU5UUkEiKXsKICAgIGE8LXJlZF9jYV9CJERlbnNbeF0tMQogIH1lbHNlIGlmKHJlZF9jYV9CJFR5cGVbeF09PSJJTlRFUiIpewogICAgYTwtMQogIH0KICAKICBhCn0pCgpyZWRfY2FfQiREZW5zX0NvbXA8LXNhcHBseShjKDE6bGVuZ3RoKHJlZF9jYV9CWywxXSkpLCBmdW5jdGlvbih4KXsKICBpZihyZWRfY2FfQiRUeXBlW3hdPT0iSU5UUkEiKXsKICAgIGE8LTAKICB9ZWxzZSBpZihyZWRfY2FfQiRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGE8LXJlZF9jYV9CJERlbnNbeF0tMQogIH0KICAKICBhCn0pCgpyZWRfY2FfQiRGb2NhbDwtbWFwdmFsdWVzKHJlZF9jYV9CJEZvY2FsU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCAiU1I1IikpCnJlZF9jYV9CJENvbXA8LW1hcHZhbHVlcyhyZWRfY2FfQiRDb21wU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCAiU1I1IikpCgpyZWRfY2FfQiRwcmVkPC1zYXBwbHkoYygxOmxlbmd0aChyZWRfY2FfQlssMV0pKSwgZnVuY3Rpb24oeCl7CiAgCiAgaWYocmVkX2NhX0IkRm9jYWxbeF09PSJTUjEiIHwgcmVkX2NhX0IkRm9jYWxbeF09PSJTUjIiKXsKICAgIGF1eF9kYXRhPC1zdWJzZXQocGFyYW1fYWxsX0IsIEVudmlyb25tZW50PT1yZWRfY2FfQiRFbnZbeF0gJiBSZXBsaWNhdGU9PSByZWRfY2FfQiRSZXBbeF0gJiBhcy5jaGFyYWN0ZXIoVHVfUmVnaW1lKT09cmVkX2NhX0IkRm9jYWxbeF0pCiAgICAKICAgIGF1eF9wcmVkPC1ya19mdW5jKGxhbWJkYT1hdXhfZGF0YSRUdV9sYW1iZGFbMV0sIGFscGhhX2lpID1hdXhfZGF0YSRUdV9pbnRyYVsxXSwgYWxwaGFfaWogPSBhdXhfZGF0YSRUdV9pbnRlclsxXSwgZGVuc19pID0gcmVkX2NhX0IkRGVuc19Gb2NhbFt4XSwgZGVuc19qID0gIHJlZF9jYV9CJERlbnNfQ29tcFt4XSkKICAgIAogIH1lbHNlIGlmKHJlZF9jYV9CJEZvY2FsW3hdPT0iU1I0IiB8IHJlZF9jYV9CJEZvY2FsW3hdPT0iU1I1Iil7CiAgICBhdXhfZGF0YTwtc3Vic2V0KHBhcmFtX2FsbF9CLCBFbnZpcm9ubWVudD09cmVkX2NhX0IkRW52W3hdICYgUmVwbGljYXRlPT0gcmVkX2NhX0IkUmVwW3hdICYgYXMuY2hhcmFjdGVyKFRlX1JlZ2ltZSk9PXJlZF9jYV9CJEZvY2FsW3hdKQogICAgCiAgICBhdXhfcHJlZDwtcmtfZnVuYyhsYW1iZGE9YXV4X2RhdGEkVGVfbGFtYmRhWzFdLCBhbHBoYV9paSA9YXV4X2RhdGEkVGVfaW50cmFbMV0sIGFscGhhX2lqID0gYXV4X2RhdGEkVGVfaW50ZXJbMV0sIGRlbnNfaSA9IHJlZF9jYV9CJERlbnNfRm9jYWxbeF0sIGRlbnNfaiA9ICByZWRfY2FfQiREZW5zX0NvbXBbeF0pCiAgfQogIAogIGF1eF9wcmVkCn0pCgpyZWRfY2FfQiRwcmVkX0w8LXNhcHBseShjKDE6bGVuZ3RoKHJlZF9jYV9CWywxXSkpLCBmdW5jdGlvbih4KXsKICAKICBpZihyZWRfY2FfQiRGb2NhbFt4XT09IlNSMSIgfCByZWRfY2FfQiRGb2NhbFt4XT09IlNSMiIpewogICAgYXV4X2RhdGE8LXN1YnNldChwYXJhbV9hbGxfQl9sb3dlciwgRW52aXJvbm1lbnQ9PXJlZF9jYV9CJEVudlt4XSAmIFJlcGxpY2F0ZT09IHJlZF9jYV9CJFJlcFt4XSAmIGFzLmNoYXJhY3RlcihUdV9SZWdpbWUpPT1yZWRfY2FfQiRGb2NhbFt4XSkKICAgIAogICAgYXV4X3ByZWQ8LXJrX2Z1bmMobGFtYmRhPWF1eF9kYXRhJFR1X2xhbWJkYVsxXSwgYWxwaGFfaWkgPWF1eF9kYXRhJFR1X2ludHJhWzFdLCBhbHBoYV9paiA9IGF1eF9kYXRhJFR1X2ludGVyWzFdLCBkZW5zX2kgPSByZWRfY2FfQiREZW5zX0ZvY2FsW3hdLCBkZW5zX2ogPSAgcmVkX2NhX0IkRGVuc19Db21wW3hdKQogICAgCiAgfWVsc2UgaWYocmVkX2NhX0IkRm9jYWxbeF09PSJTUjQiIHwgcmVkX2NhX0IkRm9jYWxbeF09PSJTUjUiKXsKICAgIGF1eF9kYXRhPC1zdWJzZXQocGFyYW1fYWxsX0JfbG93ZXIsIEVudmlyb25tZW50PT1yZWRfY2FfQiRFbnZbeF0gJiBSZXBsaWNhdGU9PSByZWRfY2FfQiRSZXBbeF0gJiBhcy5jaGFyYWN0ZXIoVGVfUmVnaW1lKT09cmVkX2NhX0IkRm9jYWxbeF0pCiAgICAKICAgIGF1eF9wcmVkPC1ya19mdW5jKGxhbWJkYT1hdXhfZGF0YSRUZV9sYW1iZGFbMV0sIGFscGhhX2lpID1hdXhfZGF0YSRUZV9pbnRyYVsxXSwgYWxwaGFfaWogPSBhdXhfZGF0YSRUZV9pbnRlclsxXSwgZGVuc19pID0gcmVkX2NhX0IkRGVuc19Gb2NhbFt4XSwgZGVuc19qID0gIHJlZF9jYV9CJERlbnNfQ29tcFt4XSkKICB9CiAgCiAgYXV4X3ByZWQKfSkKCnJlZF9jYV9CJHByZWRfVTwtc2FwcGx5KGMoMTpsZW5ndGgocmVkX2NhX0JbLDFdKSksIGZ1bmN0aW9uKHgpewogIAogIGlmKHJlZF9jYV9CJEZvY2FsW3hdPT0iU1IxIiB8IHJlZF9jYV9CJEZvY2FsW3hdPT0iU1IyIil7CiAgICBhdXhfZGF0YTwtc3Vic2V0KHBhcmFtX2FsbF9CX3VwcGVyLCBFbnZpcm9ubWVudD09cmVkX2NhX0IkRW52W3hdICYgUmVwbGljYXRlPT0gcmVkX2NhX0IkUmVwW3hdICYgYXMuY2hhcmFjdGVyKFR1X1JlZ2ltZSk9PXJlZF9jYV9CJEZvY2FsW3hdKQogICAgCiAgICBhdXhfcHJlZDwtcmtfZnVuYyhsYW1iZGE9YXV4X2RhdGEkVHVfbGFtYmRhWzFdLCBhbHBoYV9paSA9YXV4X2RhdGEkVHVfaW50cmFbMV0sIGFscGhhX2lqID0gYXV4X2RhdGEkVHVfaW50ZXJbMV0sIGRlbnNfaSA9IHJlZF9jYV9CJERlbnNfRm9jYWxbeF0sIGRlbnNfaiA9ICByZWRfY2FfQiREZW5zX0NvbXBbeF0pCiAgICAKICB9ZWxzZSBpZihyZWRfY2FfQiRGb2NhbFt4XT09IlNSNCIgfCByZWRfY2FfQiRGb2NhbFt4XT09IlNSNSIpewogICAgYXV4X2RhdGE8LXN1YnNldChwYXJhbV9hbGxfQl91cHBlciwgRW52aXJvbm1lbnQ9PXJlZF9jYV9CJEVudlt4XSAmIFJlcGxpY2F0ZT09IHJlZF9jYV9CJFJlcFt4XSAmIGFzLmNoYXJhY3RlcihUZV9SZWdpbWUpPT1yZWRfY2FfQiRGb2NhbFt4XSkKICAgIAogICAgYXV4X3ByZWQ8LXJrX2Z1bmMobGFtYmRhPWF1eF9kYXRhJFRlX2xhbWJkYVsxXSwgYWxwaGFfaWkgPWF1eF9kYXRhJFRlX2ludHJhWzFdLCBhbHBoYV9paiA9IGF1eF9kYXRhJFRlX2ludGVyWzFdLCBkZW5zX2kgPSByZWRfY2FfQiREZW5zX0ZvY2FsW3hdLCBkZW5zX2ogPSAgcmVkX2NhX0IkRGVuc19Db21wW3hdKQogIH0KICAKICBhdXhfcHJlZAp9KQoKcmVkX2NhX0IkUmVwbGljYXRlPC1yZWRfY2FfQiRSZXAKc3RyKHJlZF9jYV9CKQpnZ3Bsb3Qoc3Vic2V0KHJlZF9jYV9CLCBFbnY9PSJOIiAmIEZvY2FsU1I9PTEpLCBhZXMoeD1sb2coR3Jvd3RoUmF0ZU9BKzEpLCB5PWxvZyhwcmVkKzEpKSkrCiAgZmFjZXRfZ3JpZChDb21wU1J+UmVwbGljYXRlKSsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdD0wKSsKICBnZW9tX3BvaW50KCkrCiAgeWxhYigiUHJlZGljdGVkIikrCiAgeGxhYigiT2JzZXJ2ZWQiKSsKICBnZ3RpdGxlKCJOb3JtYWwgZW52aXJvbm1lbnQgQ29udHJvbCB1cnRpY2FlIikKCmdncGxvdChzdWJzZXQocmVkX2NhX0IsIEVudj09Ik4iICYgRm9jYWxTUj09MSksIGFlcyh4PUdyb3d0aFJhdGVPQSwgeT1wcmVkKSkrCiAgZmFjZXRfZ3JpZChDb21wU1J+UmVwbGljYXRlKSsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdD0wKSsKICBnZW9tX3BvaW50KCkrCiAgeWxhYigiUHJlZGljdGVkIikrCiAgeGxhYigiT2JzZXJ2ZWQiKSsKICBnZ3RpdGxlKCJOb3JtYWwgZW52aXJvbm1lbnQgQ29udHJvbCB1cnRpY2FlIikKCgpnZ3Bsb3Qoc3Vic2V0KHJlZF9jYV9CLCBFbnY9PSJOIiAmIEZvY2FsU1I9PTEgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHk9R3Jvd3RoUmF0ZU9BLCB4PURlbnNfRm9jYWwpKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICBnZW9tX2xpbmUoYWVzKHk9cHJlZCwgeD1EZW5zX0ZvY2FsKSkrCiBnZW9tX3JpYmJvbihhZXMoeW1pbj1wcmVkX0wsIHltYXg9cHJlZF9VKSwgZmlsbD0ibGlnaHRncmV5IiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG91cj0iYmxhY2siKSsKICB5bGFiKCJHcm93dGggcmF0ZSIpKwogIHhsYWIoIkRlbnNpdHkiKSsKICBnZ3RpdGxlKCJOb3JtYWwgZW52aXJvbm1lbnQgQ29udHJvbCB1cnRpY2FlIEludHJhIikKCmdncGxvdChzdWJzZXQocmVkX2NhX0IsIEVudj09Ik4iICYgRm9jYWxTUj09MSAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PSI0IiksIGFlcyh5PUdyb3d0aFJhdGVPQSwgeD1EZW5zX0NvbXApKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICBnZW9tX2FibGluZShkYXRhPXN1YnNldChwYXJhbV9hbGxfQixUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJOIiAgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHNsb3BlPS1UdV9pbnRlciwgaW50ZXJjZXB0ID0gVHVfbGFtYmRhKSkrCiAgeWxhYigiR3Jvd3RoIHJhdGUiKSsKICB4bGFiKCJEZW5zaXR5IikrCiAgZ2d0aXRsZSgiTm9ybWFsIGVudmlyb25tZW50IENvbnRyb2wgdXJ0aWNhZSBJbnRlciBDb250cm9sIikKCmdncGxvdChzdWJzZXQocmVkX2NhX0IsIEVudj09Ik4iICYgRm9jYWxTUj09MSAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PSI1IiksIGFlcyh5PUdyb3d0aFJhdGVPQSwgeD1EZW5zX0NvbXApKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICBnZW9tX2FibGluZShkYXRhPXN1YnNldChwYXJhbV9hbGxfQixUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJOIiAgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHNsb3BlPS1UdV9pbnRlciwgaW50ZXJjZXB0ID0gVHVfbGFtYmRhKSkrCiAgeWxhYigiR3Jvd3RoIHJhdGUiKSsKICB4bGFiKCJEZW5zaXR5IikrCiAgZ2d0aXRsZSgiTm9ybWFsIGVudmlyb25tZW50IENvbnRyb2wgdXJ0aWNhZSBJbnRlciBFdm9sdmVkIikKCgpgYGAKCiMjIyBDIC0gQ1hSIG5lc3RlZApUbyBkbyB0aGlzIHdlIGhhdmUgdG8gdHJpY2sgdGhlIGN4ciAoT3NjYXIgc3VnZ2VzdGlvbiksIGJ5IHB1dHRpbmcgdGhlIGludHJhc3BlY2lmaWMgY29tcGV0aXRvcnMgaW4gYW5vdGhlciBjb2x1bW4gdGhhbiB0aGUgZm9jYWwgYW5kIHRoZW4gZXN0aW1hdGUgb25seSBpbnRyYSEKCiMjIyMjIG5vcm1hbAoKYGBge3J9CmRpci5jcmVhdGUoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9uZXN0ZWQiLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKCiMgbW9kaWZ5aW5nIGRhdGEgZnJhbWUgdG8gZml0IHRoZSB0eXBlIG9mIHNldHVwIHRoYXQgaXMgbmVlZCBmb3IgQ1hSCkNYUl9DX048LXN1YnNldChjYSwgRW52PT0iTiIpWyxjKCJSZXAiLCAiRm9jYWxTUiIsICJDb21wU1IiLCAiRGVucyIsICJUZUZlbWFsZXMiLCAiVHVGZW1hbGVzIildCgpDWFJfQ19OJEZvY2FsPC1tYXB2YWx1ZXMoQ1hSX0NfTiRGb2NhbFNSLCBjKDEsMiw0LDUpLCBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikpCkNYUl9DX04kQ29tcFNSMjwtbWFwdmFsdWVzKENYUl9DX04kQ29tcFNSLCBjKDEsMiw0LDUpLCBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikpCgpDWFJfQ19OJENvbXA8LXNhcHBseShjKDE6bGVuZ3RoKENYUl9DX05bLDFdKSksIGZ1bmN0aW9uKHgpewogIGlmKGlzLm5hKENYUl9DX04kQ29tcFNSMlt4XSkpewogICAgYTwtIENYUl9DX04kRm9jYWxbeF0KICB9ZWxzZXsKICAgIGE8LUNYUl9DX04kQ29tcFNSMlt4XQogIH0KICAKICBhCn0pCgphdXg8LWRhdGEuZnJhbWUoU1IxPXJlcCgwLCBsZW5ndGgoQ1hSX0NfTlssMV0pKSwgU1IyPXJlcCgwLCBsZW5ndGgoQ1hSX0NfTlssMV0pKSwgU1I0PXJlcCgwLCBsZW5ndGgoQ1hSX0NfTlssMV0pKSwgU1I1PXJlcCgwLCBsZW5ndGgoQ1hSX0NfTlssMV0pKSkKCmZvcihpIGluIDE6bGVuZ3RoKENYUl9DX05bLDFdKSl7CiAgI2NvbHVuYSBvbmRlIHBvciBmb2NhaXMKICBjb2x1bmFGPC13aGljaChjb2xuYW1lcyhhdXgpPT1DWFJfQ19OJEZvY2FsW2ldKQogICNjb2x1bmEgb25kZSBwb3IgY29tcGV0aWRvcnMKICBjb2x1bmFDPC13aGljaChjb2xuYW1lcyhhdXgpPT1DWFJfQ19OJENvbXBbaV0pCiAgCiAgI2lmIGl0cyB0aGUgc2FtZSByZWdpbWUKICBpZihDWFJfQ19OJEZvY2FsW2ldPT1DWFJfQ19OJENvbXBbaV0gJiBDWFJfQ19OJERlbnNbaV09PTEpewogICAgYXV4W2ksY29sdW5hRl08LUNYUl9DX04kRGVuc1tpXS0xCiAgICAKICB9ZWxzZSBpZihDWFJfQ19OJEZvY2FsW2ldPT1DWFJfQ19OJENvbXBbaV0pewogICAgYXV4W2ksY29sdW5hRl08LUNYUl9DX04kRGVuc1tpXS0xCiAgfWVsc2V7ICNpZiBpdCBpcyBoZXRlcm9zcGVjaWZpYyB0aGVuIGl0cyAtMSBmb3IgdGhlIGNvbXBldGl0b3JzIChiZWNhdXNlIG9mIHRoZSBmb2NhbCkgYW5kIGl0cyBvbmUgZm9yIHRoZSBmb2NhbAogICAgYXV4W2ksY29sdW5hQ108LUNYUl9DX04kRGVuc1tpXS0xCiAgICBhdXhbaSwgY29sdW5hRl08LTEKICB9CiAgCn0KCkNYUl9DX048LWNiaW5kKENYUl9DX04sIGF1eCkKCkNYUl9DX04kZml0bmVzczwtc2FwcGx5KGMoMTpsZW5ndGgoQ1hSX0NfTlssMV0pKSwgZnVuY3Rpb24oeCl7CiAgY29sRjwtd2hpY2goY29sbmFtZXMoQ1hSX0NfTik9PUNYUl9DX04kRm9jYWxbeF0pCiAgCiAgaWYoQ1hSX0NfTiRGb2NhbFt4XT09IlNSMSIpewogICAgYTwtQ1hSX0NfTiRUdUZlbWFsZXNbeF0vQ1hSX0NfTiRTUjFbeF0KICB9IGVsc2UgaWYoQ1hSX0NfTiRGb2NhbFt4XT09IlNSMiIpewogICAgYTwtQ1hSX0NfTiRUdUZlbWFsZXNbeF0vQ1hSX0NfTiRTUjJbeF0KICB9IGVsc2UgaWYoQ1hSX0NfTiRGb2NhbFt4XT09IlNSNCIpewogICAgYTwtQ1hSX0NfTiRUZUZlbWFsZXNbeF0vQ1hSX0NfTiRTUjRbeF0KICB9IGVsc2UgaWYoQ1hSX0NfTiRGb2NhbFt4XT09IlNSNSIpewogICAgYTwtQ1hSX0NfTiRUZUZlbWFsZXNbeF0vQ1hSX0NfTiRTUjVbeF0KICB9CiAgCiAgYQp9KQoKI3JlbW92aW5nIHJvd3MgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIGRhdGEgZm9yIGZpdG5lc3MKQ1hSX0NfTjwtQ1hSX0NfTlstd2hpY2goaXMubmEoQ1hSX0NfTiRmaXRuZXNzKSksXQoKIyBhZGRpbmcgKzEgdG8gYWxsIGRhdGEKI0NYUl9DX04kZml0bmVzczwtQ1hSX0NfTiRmaXRuZXNzKzEKCkNYUl9DX05bd2hpY2goQ1hSX0NfTiRmaXRuZXNzPT0iLUluZiIgfCBDWFJfQ19OJGZpdG5lc3M9PSJJbmYiKSwiZml0bmVzcyJdPC0wCgoKIyBhbGwgZGF0YSBnZXRzICsxIGJlY2F1c2Ugb2YgdGhlIDAgcHJvYmxlbQpDWFJfQ19OJGZpdG5lc3M8LUNYUl9DX04kZml0bmVzcysxCgojIHZlY3RvciB0aGF0IHRlbGxzIHdoaWNoIGFyZSB0aGUgc2VsZWN0aW9uIHJlZ2ltZXMsIHRoZSBjb2x1bW5zIGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSBuYW1lCm15LnJlZyA8LSBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikKc3RyKENYUl9DX04pCgojIERvIGxpc3QgcGVyIHJlcGxpY2F0ZSBhbmQgZW52aXJvbm1lbnQKUjFfaW50cmE8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT0xICYgRm9jYWw9PSJTUjEiICYgQ29tcD09IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIpXSwgU1IyPSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT0xICYgRm9jYWw9PSJTUjIiICYgQ29tcD09IlNSMiIpWyxjKCJmaXRuZXNzIiwgICJTUjIiKV0sIFNSND0gc3Vic2V0KENYUl9DX04sIFJlcD09MSAmIEZvY2FsPT0iU1I0IiAmIENvbXA9PSJTUjQiKVssYygiZml0bmVzcyIsICAiU1I0IildLCBTUjU9IHN1YnNldChDWFJfQ19OLCBSZXA9PTEgJiBGb2NhbD09IlNSNSIgJiBDb21wPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1I1IildKQoKUjJfaW50cmE8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT0yICYgRm9jYWw9PSJTUjEiICYgQ29tcD09IlNSMSIgKVssYygiZml0bmVzcyIsICJTUjEiKV0sIFNSND0gc3Vic2V0KENYUl9DX04sIFJlcD09MiAmIEZvY2FsPT0iU1I0IiAmIENvbXA9PSJTUjQiKVssYygiZml0bmVzcyIsICAiU1I0IildLCBTUjU9IHN1YnNldChDWFJfQ19OLCBSZXA9PTIgJiBGb2NhbD09IlNSNSIgJiBDb21wPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1I1IildKQoKUjNfaW50cmE8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT0zICYgRm9jYWw9PSJTUjEiICYgQ29tcD09IlNSMSIgKVssYygiZml0bmVzcyIsICJTUjEiKV0sIFNSMj0gc3Vic2V0KENYUl9DX04sIFJlcD09MyAmIEZvY2FsPT0iU1IyIiAmIENvbXA9PSJTUjIiKVssYygiZml0bmVzcyIsICAiU1IyIildLCBTUjQ9IHN1YnNldChDWFJfQ19OLCBSZXA9PTMgJiBGb2NhbD09IlNSNCIgJiBDb21wPT0iU1I0IilbLGMoImZpdG5lc3MiLCAgIlNSNCIpXSwgU1I1PSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT0zICYgRm9jYWw9PSJTUjUiICYgQ29tcD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSNSIpXSkKClI0X2ludHJhPC1saXN0KFNSMT0gc3Vic2V0KENYUl9DX04sIFJlcD09NCAmIEZvY2FsPT0iU1IxIiAmIENvbXA9PSJTUjEiIClbLGMoImZpdG5lc3MiLCAiU1IxIildLCBTUjI9IHN1YnNldChDWFJfQ19OLCBSZXA9PTQgJiBGb2NhbD09IlNSMiIgJiBDb21wPT0iU1IyIilbLGMoImZpdG5lc3MiLCAgIlNSMiIpXSwgU1I0PSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT00ICYgRm9jYWw9PSJTUjQiICYgQ29tcD09IlNSNCIpWyxjKCJmaXRuZXNzIiwgICJTUjQiKV0sIFNSNT0gc3Vic2V0KENYUl9DX04sIFJlcD09NCAmIEZvY2FsPT0iU1I1IiAmIENvbXA9PSJTUjUiKVssYygiZml0bmVzcyIsICJTUjUiKV0pCgpSNV9pbnRyYTwtbGlzdChTUjE9IHN1YnNldChDWFJfQ19OLCBSZXA9PTUgJiBGb2NhbD09IlNSMSIgJiBDb21wPT0iU1IxIiApWyxjKCJmaXRuZXNzIiwgIlNSMSIpXSwgU1IyPSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT01ICYgRm9jYWw9PSJTUjIiICYgQ29tcD09IlNSMiIpWyxjKCJmaXRuZXNzIiwgICJTUjIiKV0sIFNSND0gc3Vic2V0KENYUl9DX04sIFJlcD09NSAmIEZvY2FsPT0iU1I0IiAmIENvbXA9PSJTUjQiKVssYygiZml0bmVzcyIsICAiU1I0IildLCBTUjU9IHN1YnNldChDWFJfQ19OLCBSZXA9PTUgJiBGb2NhbD09IlNSNSIgJiBDb21wPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1I1IildKQoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMgRE9JTkcgVEhFIElOVFJBIEVTVElNQVRFUwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCmN4cl9DLlIxX2ludHJhPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFIxX2ludHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzFOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlIyX2ludHJhPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFIyX2ludHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlIzX2ludHJhPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFIzX2ludHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzNOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlI0X2ludHJhPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFI0X2ludHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzROLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlI1X2ludHJhPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFI1X2ludHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzVOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCnN1bW1hcnkoY3hyX0MuUjFfaW50cmEpCgojIyMjIyMjIyMjIyMjIyMjIwojIyMjIyNEb2luZyB0aGUgaW50ZXIgZXN0aW1hdGVzCiMjIyMjIyMjIyMjIyMjIyMjIwoKUjE8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT0xICYgRm9jYWw9PSJTUjEiICYgQ29tcCE9IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KENYUl9DX04sIFJlcD09MSAmIEZvY2FsPT0iU1IyIiYgQ29tcCE9IlNSMiIpWyxjKCJmaXRuZXNzIiwgIlNSNCIsICJTUjUiKV0sIFNSND0gc3Vic2V0KENYUl9DX04sIFJlcD09MSAmIEZvY2FsPT0iU1I0IiAmIENvbXAhPSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIildLCBTUjU9IHN1YnNldChDWFJfQ19OLCBSZXA9PTEgJiBGb2NhbD09IlNSNSIgJiBDb21wIT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIpXSkKClIyPC1saXN0KFNSMT0gc3Vic2V0KENYUl9DX04sIFJlcD09MiAmIEZvY2FsPT0iU1IxIiAmIENvbXAhPSJTUjEiKVssYygiZml0bmVzcyIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQ19OLCBSZXA9PTIgJiBGb2NhbD09IlNSNCIgJiBDb21wIT0iU1I0IilbLGMoImZpdG5lc3MiLCAiU1IxIildLCBTUjU9IHN1YnNldChDWFJfQ19OLCBSZXA9PTIgJiBGb2NhbD09IlNSNSIgJiBDb21wIT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIildKQoKUjM8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT0zICYgRm9jYWw9PSJTUjEiICYgQ29tcCE9IlNSMSIpWyxjKCJmaXRuZXNzIiwgICJTUjQiLCAiU1I1IildLCBTUjI9IHN1YnNldChDWFJfQ19OLCBSZXA9PTMgJiBGb2NhbD09IlNSMiIgJiBDb21wIT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT0zICYgRm9jYWw9PSJTUjQiICYgQ29tcCE9IlNSNCIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiKV0sIFNSNT0gc3Vic2V0KENYUl9DX04sIFJlcD09MyAmIEZvY2FsPT0iU1I1IiAmIENvbXAhPSJTUjUiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIildKQoKUjQ8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT00ICYgRm9jYWw9PSJTUjEiICYgQ29tcCE9IlNSMSIpWyxjKCJmaXRuZXNzIiwgICJTUjQiLCAiU1I1IildLCBTUjI9IHN1YnNldChDWFJfQ19OLCBSZXA9PTQgJiBGb2NhbD09IlNSMiIgJiBDb21wIT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT00ICYgRm9jYWw9PSJTUjQiICYgQ29tcCE9IlNSNCIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiKV0sIFNSNT0gc3Vic2V0KENYUl9DX04sIFJlcD09NCAmIEZvY2FsPT0iU1I1IiAmIENvbXAhPSJTUjUiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIildKQoKUjU8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT01ICYgRm9jYWw9PSJTUjEiICYgQ29tcCE9IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KENYUl9DX04sIFJlcD09NSAmIEZvY2FsPT0iU1IyIiAmIENvbXAhPSJTUjIiKVssYygiZml0bmVzcyIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQ19OLCBSZXA9PTUgJiBGb2NhbD09IlNSNCIgJiBDb21wIT0iU1I0IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIpXSwgU1I1PSBzdWJzZXQoQ1hSX0NfTiwgUmVwPT01ICYgRm9jYWw9PSJTUjUiICYgQ29tcCE9IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiKV0pCgoKCgpjeHJfQy5SMTwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJwYWlyd2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzFOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlIyX3NyMTwtY3hyX3BtX2ZpdChkYXRhID0gUjJbWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJwYWlyd2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzJOW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKY3hyX0MuUjJfc3I0PC1jeHJfcG1fZml0KGRhdGEgPSBSMltbMl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzJOW1syXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKY3hyX0MuUjJfc3I1PC1jeHJfcG1fZml0KGRhdGEgPSBSMltbM11dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzJOW1szXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKCmN4cl9DLlIzPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QoYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gZml4ZWRfdGVybXNfM04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKY3hyX0MuUjQ8LWN4cl9wbV9tdWx0aWZpdChkYXRhID0gUjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAicGFpcndpc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBmaXhlZF90ZXJtc180TiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpjeHJfQy5SNTwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJwYWlyd2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zXzVOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlIyX2ludHJhJGFscGhhX21hdHJpeApgYGAKCiMjIyMjIyBjYWRtaXVtCgpgYGB7cn0KIyBtb2RpZnlpbmcgZGF0YSBmcmFtZSB0byBmaXQgdGhlIHR5cGUgb2Ygc2V0dXAgdGhhdCBpcyBuZWVkIGZvciBDWFIKQ1hSX0NfQ2Q8LXN1YnNldChjYSwgRW52PT0iQ2QiKVssYygiUmVwIiwgIkZvY2FsU1IiLCAiQ29tcFNSIiwgIkRlbnMiLCAiVGVGZW1hbGVzIiwgIlR1RmVtYWxlcyIpXQoKQ1hSX0NfQ2QkRm9jYWw8LW1hcHZhbHVlcyhDWFJfQ19DZCRGb2NhbFNSLCBjKDEsMiw0LDUpLCBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikpCkNYUl9DX0NkJENvbXBTUjI8LW1hcHZhbHVlcyhDWFJfQ19DZCRDb21wU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCJTUjUiKSkKCkNYUl9DX0NkJENvbXA8LXNhcHBseShjKDE6bGVuZ3RoKENYUl9DX0NkWywxXSkpLCBmdW5jdGlvbih4KXsKICBpZihpcy5uYShDWFJfQ19DZCRDb21wU1IyW3hdKSl7CiAgICBhPC0gQ1hSX0NfQ2QkRm9jYWxbeF0KICB9ZWxzZXsKICAgIGE8LUNYUl9DX0NkJENvbXBTUjJbeF0KICB9CiAgCiAgYQp9KQoKYXV4PC1kYXRhLmZyYW1lKFNSMT1yZXAoMCwgbGVuZ3RoKENYUl9DX0NkWywxXSkpLCBTUjI9cmVwKDAsIGxlbmd0aChDWFJfQ19DZFssMV0pKSwgU1I0PXJlcCgwLCBsZW5ndGgoQ1hSX0NfQ2RbLDFdKSksIFNSNT1yZXAoMCwgbGVuZ3RoKENYUl9DX0NkWywxXSkpKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ1hSX0NfQ2RbLDFdKSl7CiAgI2NvbHVuYSBvbmRlIHBvciBmb2NhaXMKICBjb2x1bmFGPC13aGljaChjb2xuYW1lcyhhdXgpPT1DWFJfQ19DZCRGb2NhbFtpXSkKICAjY29sdW5hIG9uZGUgcG9yIGNvbXBldGlkb3JzCiAgY29sdW5hQzwtd2hpY2goY29sbmFtZXMoYXV4KT09Q1hSX0NfQ2QkQ29tcFtpXSkKICAKICAjaWYgaXRzIHRoZSBzYW1lIHJlZ2ltZQogIGlmKENYUl9DX0NkJEZvY2FsW2ldPT1DWFJfQ19DZCRDb21wW2ldICYgQ1hSX0NfQ2QkRGVuc1tpXT09MSl7CiAgICBhdXhbaSxjb2x1bmFGXTwtQ1hSX0NfQ2QkRGVuc1tpXS0xCiAgICAKICB9ZWxzZSBpZihDWFJfQ19DZCRGb2NhbFtpXT09Q1hSX0NfQ2QkQ29tcFtpXSl7CiAgICBhdXhbaSxjb2x1bmFGXTwtQ1hSX0NfQ2QkRGVuc1tpXS0xCiAgfWVsc2V7ICNpZiBpdCBpcyBoZXRlcm9zcGVjaWZpYyB0aGVuIGl0cyAtMSBmb3IgdGhlIGNvbXBldGl0b3JzIChiZWNhdXNlIG9mIHRoZSBmb2NhbCkgYW5kIGl0cyBvbmUgZm9yIHRoZSBmb2NhbAogICAgYXV4W2ksY29sdW5hQ108LUNYUl9DX0NkJERlbnNbaV0tMQogICAgYXV4W2ksIGNvbHVuYUZdPC0xCiAgfQogIAp9CgpDWFJfQ19DZDwtY2JpbmQoQ1hSX0NfQ2QsIGF1eCkKCkNYUl9DX0NkJGZpdG5lc3M8LXNhcHBseShjKDE6bGVuZ3RoKENYUl9DX0NkWywxXSkpLCBmdW5jdGlvbih4KXsKICBjb2xGPC13aGljaChjb2xuYW1lcyhDWFJfQ19DZCk9PUNYUl9DX0NkJEZvY2FsW3hdKQogIAogIGlmKENYUl9DX0NkJEZvY2FsW3hdPT0iU1IxIil7CiAgICBhPC1DWFJfQ19DZCRUdUZlbWFsZXNbeF0vQ1hSX0NfQ2QkU1IxW3hdCiAgfSBlbHNlIGlmKENYUl9DX0NkJEZvY2FsW3hdPT0iU1IyIil7CiAgICBhPC1DWFJfQ19DZCRUdUZlbWFsZXNbeF0vQ1hSX0NfQ2QkU1IyW3hdCiAgfSBlbHNlIGlmKENYUl9DX0NkJEZvY2FsW3hdPT0iU1I0Iil7CiAgICBhPC1DWFJfQ19DZCRUZUZlbWFsZXNbeF0vQ1hSX0NfQ2QkU1I0W3hdCiAgfSBlbHNlIGlmKENYUl9DX0NkJEZvY2FsW3hdPT0iU1I1Iil7CiAgICBhPC1DWFJfQ19DZCRUZUZlbWFsZXNbeF0vQ1hSX0NfQ2QkU1I1W3hdCiAgfQogIAogIGEKfSkKCiNyZW1vdmluZyByb3dzIGZvciB3aGljaCB0aGVyZSBpcyBubyBkYXRhIGZvciBmaXRuZXNzCkNYUl9DX0NkPC1DWFJfQ19DZFstd2hpY2goaXMubmEoQ1hSX0NfQ2QkZml0bmVzcykpLF0KCiMgYWRkaW5nICsxIHRvIGFsbCBkYXRhCiNDWFJfQ19DZCRmaXRuZXNzPC1DWFJfQ19DZCRmaXRuZXNzKzEKCkNYUl9DX0NkW3doaWNoKENYUl9DX0NkJGZpdG5lc3M9PSItSW5mIiB8IENYUl9DX0NkJGZpdG5lc3M9PSJJbmYiKSwiZml0bmVzcyJdPC0wCgoKIyBhbGwgZGF0YSBnZXRzICsxIGJlY2F1c2Ugb2YgdGhlIDAgcHJvYmxlbQpDWFJfQ19DZCRmaXRuZXNzPC1DWFJfQ19DZCRmaXRuZXNzKzEKCiMgdmVjdG9yIHRoYXQgdGVsbHMgd2hpY2ggYXJlIHRoZSBzZWxlY3Rpb24gcmVnaW1lcywgdGhlIGNvbHVtbnMgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIG5hbWUKbXkucmVnIDwtIGMoIlNSMSIsICJTUjIiLCJTUjQiLCJTUjUiKQpzdHIoQ1hSX0NfQ2QpCgojIERvIGxpc3QgcGVyIHJlcGxpY2F0ZSBhbmQgZW52aXJvbm1lbnQKUjFfY2RfaW50cmE8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09MSAmIEZvY2FsPT0iU1IxIiAmIENvbXA9PSJTUjEiKVssYygiZml0bmVzcyIsICJTUjEiKV0sIFNSMj0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTEgJiBGb2NhbD09IlNSMiIgJiBDb21wPT0iU1IyIilbLGMoImZpdG5lc3MiLCAgIlNSMiIpXSwgU1I0PSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09MSAmIEZvY2FsPT0iU1I0IiAmIENvbXA9PSJTUjQiKVssYygiZml0bmVzcyIsICAiU1I0IildLCBTUjU9IHN1YnNldChDWFJfQ19DZCwgUmVwPT0xICYgRm9jYWw9PSJTUjUiICYgQ29tcD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSNSIpXSkKClIyX2NkX2ludHJhPC1saXN0KFNSMT0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTIgJiBGb2NhbD09IlNSMSIgJiBDb21wPT0iU1IxIiApWyxjKCJmaXRuZXNzIiwgIlNSMSIpXSwgU1I0PSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09MiAmIEZvY2FsPT0iU1I0IiAmIENvbXA9PSJTUjQiKVssYygiZml0bmVzcyIsICAiU1I0IildLCBTUjU9IHN1YnNldChDWFJfQ19DZCwgUmVwPT0yICYgRm9jYWw9PSJTUjUiICYgQ29tcD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSNSIpXSkKClIzX2NkX2ludHJhPC1saXN0KFNSMT0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTMgJiBGb2NhbD09IlNSMSIgJiBDb21wPT0iU1IxIiApWyxjKCJmaXRuZXNzIiwgIlNSMSIpXSwgU1IyPSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09MyAmIEZvY2FsPT0iU1IyIiAmIENvbXA9PSJTUjIiKVssYygiZml0bmVzcyIsICAiU1IyIildLCBTUjQ9IHN1YnNldChDWFJfQ19DZCwgUmVwPT0zICYgRm9jYWw9PSJTUjQiICYgQ29tcD09IlNSNCIpWyxjKCJmaXRuZXNzIiwgICJTUjQiKV0sIFNSNT0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTMgJiBGb2NhbD09IlNSNSIgJiBDb21wPT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1I1IildKQoKUjRfY2RfaW50cmE8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09NCAmIEZvY2FsPT0iU1IxIiAmIENvbXA9PSJTUjEiIClbLGMoImZpdG5lc3MiLCAiU1IxIildLCBTUjI9IHN1YnNldChDWFJfQ19DZCwgUmVwPT00ICYgRm9jYWw9PSJTUjIiICYgQ29tcD09IlNSMiIpWyxjKCJmaXRuZXNzIiwgICJTUjIiKV0sIFNSND0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTQgJiBGb2NhbD09IlNSNCIgJiBDb21wPT0iU1I0IilbLGMoImZpdG5lc3MiLCAgIlNSNCIpXSwgU1I1PSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09NCAmIEZvY2FsPT0iU1I1IiAmIENvbXA9PSJTUjUiKVssYygiZml0bmVzcyIsICJTUjUiKV0pCgpSNV9jZF9pbnRyYTwtbGlzdChTUjE9IHN1YnNldChDWFJfQ19DZCwgUmVwPT01ICYgRm9jYWw9PSJTUjEiICYgQ29tcD09IlNSMSIgKVssYygiZml0bmVzcyIsICJTUjEiKV0sIFNSMj0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTUgJiBGb2NhbD09IlNSMiIgJiBDb21wPT0iU1IyIilbLGMoImZpdG5lc3MiLCAgIlNSMiIpXSwgU1I0PSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09NSAmIEZvY2FsPT0iU1I0IiAmIENvbXA9PSJTUjQiKVssYygiZml0bmVzcyIsICAiU1I0IildLCBTUjU9IHN1YnNldChDWFJfQ19DZCwgUmVwPT01ICYgRm9jYWw9PSJTUjUiICYgQ29tcD09IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSNSIpXSkKCgojIyMjIGxhbWJkYQoKZml4ZWRfdGVybXNfQ18xTiA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09IkNkIiAmIFNSPT0xKSRsYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iQ2QiICYgU1I9PTIpJGxhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09IkNkIiAmIFNSPT00KSRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iQ2QiICYgU1I9PTUpJGxhbWJkYSkpCgpmaXhlZF90ZXJtc19DXzJOIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0yICYgRW52PT0iQ2QiICYgU1I9PTEpJGxhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTIgJiBFbnY9PSJDZCIgJiBTUj09NCkkbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MiAmIEVudj09IkNkIiAmIFNSPT01KSRsYW1iZGEpKQoKZml4ZWRfdGVybXNfQ18zTiA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09IkNkIiAmIFNSPT0xKSRsYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0zICYgRW52PT0iQ2QiICYgU1I9PTIpJGxhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09IkNkIiAmIFNSPT00KSRsYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0zICYgRW52PT0iQ2QiICYgU1I9PTUpJGxhbWJkYSkpCgpmaXhlZF90ZXJtc19DXzROIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT00ICYgRW52PT0iQ2QiICYgU1I9PTEpJGxhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJDZCIgJiBTUj09MikkbGFtYmRhKSwgIyBmb2NhbCBzcCAyCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT00ICYgRW52PT0iQ2QiICYgU1I9PTQpJGxhbWJkYSksCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGE9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJDZCIgJiBTUj09NSkkbGFtYmRhKSkKCmZpeGVkX3Rlcm1zX0NfNU4gPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTUgJiBFbnY9PSJDZCIgJiBTUj09MSkkbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09IkNkIiAmIFNSPT0yKSRsYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTUgJiBFbnY9PSJDZCIgJiBTUj09NCkkbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09IkNkIiAmIFNSPT01KSRsYW1iZGEpKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIERPSU5HIFRIRSBJTlRSQSBFU1RJTUFURVMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgpjeHJfQy5SMV9jZF9pbnRyYTwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSMV9jZF9pbnRyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBmaXhlZF90ZXJtc19DXzFOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlIyX2NkX2ludHJhPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFIyX2NkX2ludHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zX0NfMk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKY3hyX0MuUjNfY2RfaW50cmE8LWN4cl9wbV9tdWx0aWZpdChkYXRhID0gUjNfY2RfaW50cmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAiZ2xvYmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QoYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gZml4ZWRfdGVybXNfQ18zTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpjeHJfQy5SNF9jZF9pbnRyYTwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSNF9jZF9pbnRyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBmaXhlZF90ZXJtc19DXzROLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlI1X2NkX2ludHJhPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFI1X2NkX2ludHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zX0NfNU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKc3VtbWFyeShjeHJfQy5SMV9jZF9pbnRyYSkKCiMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjI0RvaW5nIHRoZSBpbnRlciBlc3RpbWF0ZXMKIyMjIyMjIyMjIyMjIyMjIyMjCgpSMV9jZDwtbGlzdChTUjE9IHN1YnNldChDWFJfQ19DZCwgUmVwPT0xICYgRm9jYWw9PSJTUjEiICYgQ29tcCE9IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTEgJiBGb2NhbD09IlNSMiImIENvbXAhPSJTUjIiKVssYygiZml0bmVzcyIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQ19DZCwgUmVwPT0xICYgRm9jYWw9PSJTUjQiICYgQ29tcCE9IlNSNCIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiKV0sIFNSNT0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTEgJiBGb2NhbD09IlNSNSIgJiBDb21wIT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIpXSkKClIyX2NkPC1saXN0KFNSMT0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTIgJiBGb2NhbD09IlNSMSIgJiBDb21wIT0iU1IxIilbLGMoImZpdG5lc3MiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09MiAmIEZvY2FsPT0iU1I0IiAmIENvbXAhPSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiKV0sIFNSNT0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTIgJiBGb2NhbD09IlNSNSIgJiBDb21wIT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIildKQoKUjNfY2Q8LWxpc3QoU1IxPSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09MyAmIEZvY2FsPT0iU1IxIiAmIENvbXAhPSJTUjEiKVssYygiZml0bmVzcyIsICAiU1I0IiwgIlNSNSIpXSwgU1IyPSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09MyAmIEZvY2FsPT0iU1IyIiAmIENvbXAhPSJTUjIiKVssYygiZml0bmVzcyIsICJTUjQiLCAiU1I1IildLCBTUjQ9IHN1YnNldChDWFJfQ19DZCwgUmVwPT0zICYgRm9jYWw9PSJTUjQiICYgQ29tcCE9IlNSNCIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiKV0sIFNSNT0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTMgJiBGb2NhbD09IlNSNSIgJiBDb21wIT0iU1I1IilbLGMoImZpdG5lc3MiLCAiU1IxIiwgIlNSMiIpXSkKClI0X2NkPC1saXN0KFNSMT0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTQgJiBGb2NhbD09IlNSMSIgJiBDb21wIT0iU1IxIilbLGMoImZpdG5lc3MiLCAgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTQgJiBGb2NhbD09IlNSMiIgJiBDb21wIT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09NCAmIEZvY2FsPT0iU1I0IiAmIENvbXAhPSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIildLCBTUjU9IHN1YnNldChDWFJfQ19DZCwgUmVwPT00ICYgRm9jYWw9PSJTUjUiICYgQ29tcCE9IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiKV0pCgpSNV9jZDwtbGlzdChTUjE9IHN1YnNldChDWFJfQ19DZCwgUmVwPT01ICYgRm9jYWw9PSJTUjEiICYgQ29tcCE9IlNSMSIpWyxjKCJmaXRuZXNzIiwgIlNSNCIsICJTUjUiKV0sIFNSMj0gc3Vic2V0KENYUl9DX0NkLCBSZXA9PTUgJiBGb2NhbD09IlNSMiIgJiBDb21wIT0iU1IyIilbLGMoImZpdG5lc3MiLCAiU1I0IiwgIlNSNSIpXSwgU1I0PSBzdWJzZXQoQ1hSX0NfQ2QsIFJlcD09NSAmIEZvY2FsPT0iU1I0IiAmIENvbXAhPSJTUjQiKVssYygiZml0bmVzcyIsICJTUjEiLCAiU1IyIildLCBTUjU9IHN1YnNldChDWFJfQ19DZCwgUmVwPT01ICYgRm9jYWw9PSJTUjUiICYgQ29tcCE9IlNSNSIpWyxjKCJmaXRuZXNzIiwgIlNSMSIsICJTUjIiKV0pCgoKCgpjeHJfQy5SMV9jZDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSMV9jZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJwYWlyd2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zX0NfMU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKY3hyX0MuUjJfY2Rfc3IxPC1jeHJfcG1fZml0KGRhdGEgPSBSMl9jZFtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QoYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gZml4ZWRfdGVybXNfQ18yTltbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlIyX2NkX3NyNDwtY3hyX3BtX2ZpdChkYXRhID0gUjJfY2RbWzJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBmaXhlZF90ZXJtc19DXzJOW1syXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKY3hyX0MuUjJfY2Rfc3I1PC1jeHJfcG1fZml0KGRhdGEgPSBSMl9jZFtbM11dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gImdsb2JhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zX0NfMk5bWzNdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpjeHJfQy5SM19jZDwtY3hyX3BtX211bHRpZml0KGRhdGEgPSBSM19jZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWxfY29sdW1uID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZmFtaWx5ID0gIlJLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uX21ldGhvZCA9ICJOZWxkZXItTWVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZm9ybSA9ICJwYWlyd2lzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Nvdl9mb3JtID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZXMgPSBsaXN0KGFscGhhX2ludGVyID0gMC4xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90ZXJtcyA9IGZpeGVkX3Rlcm1zX0NfM04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gc3RhbmRhcmQgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9zYW1wbGVzID0gMjAwKQoKY3hyX0MuUjRfY2Q8LWN4cl9wbV9tdWx0aWZpdChkYXRhID0gUjRfY2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsX2NvbHVtbiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZhbWlseSA9ICJSSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbl9tZXRob2QgPSAiTmVsZGVyLU1lYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2Zvcm0gPSAicGFpcndpc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb3ZfZm9ybSA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWVzID0gbGlzdChhbHBoYV9pbnRlciA9IDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdGVybXMgPSBmaXhlZF90ZXJtc19DXzROLAogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHN0YW5kYXJkIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfc2FtcGxlcyA9IDIwMCkKCmN4cl9DLlI1X2NkPC1jeHJfcG1fbXVsdGlmaXQoZGF0YSA9IFI1X2NkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb2NhbF9jb2x1bW4gPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mYW1pbHkgPSAiUksiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZhcmlhdGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25fbWV0aG9kID0gIk5lbGRlci1NZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mb3JtID0gInBhaXJ3aXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY292X2Zvcm0gPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3ZhbHVlcyA9IGxpc3QoYWxwaGFfaW50ZXIgPSAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3Rlcm1zID0gZml4ZWRfdGVybXNfQ181TiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzdGFuZGFyZCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX3NhbXBsZXMgPSAyMDApCgpjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXgKYGBgCgoKcm93cyBpbiB0aGUgYWxwaGEgZWxlbWVudCBvZiB0aGUgcmV0dXJuaW5nIGxpc3QgY29ycmVzcG9uZCB0byBzcGVjaWVzIGkgYW5kIGNvbHVtbnMgdG8gc3BlY2llcyBqIGZvciBlYWNoIM6xaWogY29lZmZpY2llbnQuCgojIyMjIyMgZGF0YSB0YWJsZSBzdW1tYXJ5IHdhdGVyCgpgYGB7cn0KCmN4cl9wYXJhbV9DPC1leHBhbmQuZ3JpZChUdV9SZWdpbWU9YygiU1IxIiwgIlNSMiIpLCBUZV9SZWdpbWU9YygiU1I0IiwgIlNSNSIpLCBSZXBsaWNhdGU9YygxLDIsMyw0LDUpLCBFbnZpcm9ubWVudD1jKCJOIikpCmN4cl9wYXJhbV9DJFR1X2xhbWJkYTwtMApjeHJfcGFyYW1fQyRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX0MkVHVfaW50cmE8LTAKY3hyX3BhcmFtX0MkVGVfaW50cmE8LTAKY3hyX3BhcmFtX0MkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX0MkVGVfaW50ZXI8LTAKCiNyZW1vdmluZyBTUjIgZm9yIHJlcGxpY2F0ZSAyCmN4cl9wYXJhbV9DPC1jeHJfcGFyYW1fQ1std2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0yICYgY3hyX3BhcmFtX0MkVHVfUmVnaW1lPT0iU1IyIiksXQoKCmN4cl9wYXJhbV9DW3doaWNoKGN4cl9wYXJhbV9DJFJlcGxpY2F0ZT09MSksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlIxX2ludHJhJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLGN4cl9DLlIxX2ludHJhJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQ1t3aGljaChjeHJfcGFyYW1fQyRSZXBsaWNhdGU9PTEpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SMV9pbnRyYSRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSxjeHJfQy5SMV9pbnRyYSRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSwgY3hyX0MuUjFfaW50cmEkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEsY3hyX0MuUjFfaW50cmEkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ1t3aGljaChjeHJfcGFyYW1fQyRSZXBsaWNhdGU9PTIpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SMl9pbnRyYSRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYSxjeHJfQy5SMl9pbnRyYSRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYSkKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0yKSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjJfaW50cmEkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEsY3hyX0MuUjJfaW50cmEkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ1t3aGljaChjeHJfcGFyYW1fQyRSZXBsaWNhdGU9PTMpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SM19pbnRyYSRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYSxjeHJfQy5SM19pbnRyYSRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0zKSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjNfaW50cmEkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEsY3hyX0MuUjNfaW50cmEkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEsIGN4cl9DLlIzX2ludHJhJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLGN4cl9DLlIzX2ludHJhJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT00KSwiVHVfbGFtYmRhIl08LWMoY3hyX0MuUjRfaW50cmEkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEsY3hyX0MuUjRfaW50cmEkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9DW3doaWNoKGN4cl9wYXJhbV9DJFJlcGxpY2F0ZT09NCksIlRlX2xhbWJkYSJdPC1jKGN4cl9DLlI0X2ludHJhJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLGN4cl9DLlI0X2ludHJhJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLCBjeHJfQy5SNF9pbnRyYSRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSxjeHJfQy5SNF9pbnRyYSRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9DW3doaWNoKGN4cl9wYXJhbV9DJFJlcGxpY2F0ZT09NSksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlI1X2ludHJhJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLGN4cl9DLlI1X2ludHJhJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQ1t3aGljaChjeHJfcGFyYW1fQyRSZXBsaWNhdGU9PTUpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SNV9pbnRyYSRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSxjeHJfQy5SNV9pbnRyYSRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSwgY3hyX0MuUjVfaW50cmEkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEsY3hyX0MuUjVfaW50cmEkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEpCgoKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0xKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9DLlIxX2ludHJhJGFscGhhX21hdHJpeFsyLDFdKSwgMikKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9DLlIxX2ludHJhJGFscGhhX21hdHJpeFs0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0yKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjJfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0pLCAyKQpjeHJfcGFyYW1fQ1t3aGljaChjeHJfcGFyYW1fQyRSZXBsaWNhdGU9PTIpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SMl9pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXSwgY3hyX0MuUjJfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0pKQoKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0zKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjNfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeFsyLDFdKSwgMikKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0zKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjNfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeFs0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT00KSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjRfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeFsyLDFdKSwgMikKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT00KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjRfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeFs0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT01KSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjVfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeFsyLDFdKSwgMikKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT01KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjVfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeFs0LDFdKSwgZWFjaD0yKQoKCmN4cl9wYXJhbV9DW3doaWNoKGN4cl9wYXJhbV9DJFJlcGxpY2F0ZT09MSksIlR1X2ludGVyIl08LWMoY3hyX0MuUjEkYWxwaGFfbWF0cml4WzEsM10sIGN4cl9DLlIxJGFscGhhX21hdHJpeFsyLDNdLGN4cl9DLlIxJGFscGhhX21hdHJpeFsxLDRdLCBjeHJfQy5SMSRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0xKSwiVGVfaW50ZXIiXTwtYyhjeHJfQy5SMSRhbHBoYV9tYXRyaXhbMywxXSwgY3hyX0MuUjEkYWxwaGFfbWF0cml4WzMsMl0sY3hyX0MuUjEkYWxwaGFfbWF0cml4WzQsMV0sIGN4cl9DLlIxJGFscGhhX21hdHJpeFs0LDJdKQoKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0yKSwiVHVfaW50ZXIiXTwtYyhjeHJfQy5SMl9zcjEkYWxwaGFfaW50ZXJbMV0sIGN4cl9DLlIyX3NyMSRhbHBoYV9pbnRlclsyXSkKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0yKSwiVGVfaW50ZXIiXTwtYyhjeHJfQy5SMl9zcjQkYWxwaGFfaW50ZXJbMV0sY3hyX0MuUjJfc3IxJGFscGhhX2ludGVyWzFdKQoKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT0zKSwiVHVfaW50ZXIiXTwtYyhjeHJfQy5SMyRhbHBoYV9tYXRyaXhbMSwzXSwgY3hyX0MuUjMkYWxwaGFfbWF0cml4WzIsM10sY3hyX0MuUjMkYWxwaGFfbWF0cml4WzEsNF0sIGN4cl9DLlIzJGFscGhhX21hdHJpeFsyLDRdKQpjeHJfcGFyYW1fQ1t3aGljaChjeHJfcGFyYW1fQyRSZXBsaWNhdGU9PTMpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIzJGFscGhhX21hdHJpeFszLDFdLCBjeHJfQy5SMyRhbHBoYV9tYXRyaXhbMywyXSxjeHJfQy5SMyRhbHBoYV9tYXRyaXhbNCwxXSwgY3hyX0MuUjMkYWxwaGFfbWF0cml4WzQsMl0pCgpjeHJfcGFyYW1fQ1t3aGljaChjeHJfcGFyYW1fQyRSZXBsaWNhdGU9PTQpLCJUdV9pbnRlciJdPC1jKGN4cl9DLlI0JGFscGhhX21hdHJpeFsxLDNdLCBjeHJfQy5SNCRhbHBoYV9tYXRyaXhbMiwzXSxjeHJfQy5SNCRhbHBoYV9tYXRyaXhbMSw0XSwgY3hyX0MuUjQkYWxwaGFfbWF0cml4WzIsNF0pCmN4cl9wYXJhbV9DW3doaWNoKGN4cl9wYXJhbV9DJFJlcGxpY2F0ZT09NCksIlRlX2ludGVyIl08LWMoY3hyX0MuUjQkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9DLlI0JGFscGhhX21hdHJpeFszLDJdLGN4cl9DLlI0JGFscGhhX21hdHJpeFs0LDFdLCBjeHJfQy5SNCRhbHBoYV9tYXRyaXhbNCwyXSkKCmN4cl9wYXJhbV9DW3doaWNoKGN4cl9wYXJhbV9DJFJlcGxpY2F0ZT09NSksIlR1X2ludGVyIl08LWMoY3hyX0MuUjUkYWxwaGFfbWF0cml4WzEsM10sIGN4cl9DLlI1JGFscGhhX21hdHJpeFsyLDNdLGN4cl9DLlI1JGFscGhhX21hdHJpeFsxLDRdLCBjeHJfQy5SNSRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX0Nbd2hpY2goY3hyX3BhcmFtX0MkUmVwbGljYXRlPT01KSwiVGVfaW50ZXIiXTwtYyhjeHJfQy5SNSRhbHBoYV9tYXRyaXhbMywxXSwgY3hyX0MuUjUkYWxwaGFfbWF0cml4WzMsMl0sY3hyX0MuUjUkYWxwaGFfbWF0cml4WzQsMV0sIGN4cl9DLlI1JGFscGhhX21hdHJpeFs0LDJdKQoKIyMjIExvd2VyCgpjeHJfcGFyYW1fQ19sb3dlcjwtZXhwYW5kLmdyaWQoVHVfUmVnaW1lPWMoIlNSMSIsICJTUjIiKSwgVGVfUmVnaW1lPWMoIlNSNCIsICJTUjUiKSwgUmVwbGljYXRlPWMoMSwyLDMsNCw1KSwgRW52aXJvbm1lbnQ9YygiTiIpKQpjeHJfcGFyYW1fQ19sb3dlciRUdV9sYW1iZGE8LTAKY3hyX3BhcmFtX0NfbG93ZXIkVGVfbGFtYmRhPC0wCmN4cl9wYXJhbV9DX2xvd2VyJFR1X2ludHJhPC0wCmN4cl9wYXJhbV9DX2xvd2VyJFRlX2ludHJhPC0wCmN4cl9wYXJhbV9DX2xvd2VyJFR1X2ludGVyPC0wCmN4cl9wYXJhbV9DX2xvd2VyJFRlX2ludGVyPC0wCgojcmVtb3ZpbmcgU1IyIGZvciByZXBsaWNhdGUgMgpjeHJfcGFyYW1fQ19sb3dlcjwtY3hyX3BhcmFtX0NfbG93ZXJbLXdoaWNoKGN4cl9wYXJhbV9DX2xvd2VyJFJlcGxpY2F0ZT09MiAmIGN4cl9wYXJhbV9DX2xvd2VyJFR1X1JlZ2ltZT09IlNSMiIpLF0KCiNTaW5jZSB0aGUgZXJyb3IgY29tZXMgZGlyZWN0bHkgZnJvbSB0aGUgZGF0YSB3ZSBuZWVkIHRvIGNyZWF0ZSBzb21lIGxpc3RzIHdpdGggdGhhdCBpbmZvcm1hdGlvbgpzZF8xTiA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09Ik4iICYgU1I9PTEpJHNkX2xhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTEgJiBFbnY9PSJOIiAmIFNSPT0yKSRzZF9sYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTEgJiBFbnY9PSJOIiAmIFNSPT00KSRzZF9sYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iTiIgJiBTUj09NSkkc2RfbGFtYmRhKSkKCnNkXzJOIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0yICYgRW52PT0iTiIgJiBTUj09MSkkc2RfbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MiAmIEVudj09Ik4iICYgU1I9PTQpJHNkX2xhbWJkYSksCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGE9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTIgJiBFbnY9PSJOIiAmIFNSPT01KSRzZF9sYW1iZGEpKQoKc2RfM04gPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTMgJiBFbnY9PSJOIiAmIFNSPT0xKSRzZF9sYW1iZGEgKSwgIyBmb2NhbCBzcCAxCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0zICYgRW52PT0iTiIgJiBTUj09Mikkc2RfbGFtYmRhKSwgIyBmb2NhbCBzcCAyCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0zICYgRW52PT0iTiIgJiBTUj09NCkkc2RfbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09Ik4iICYgU1I9PTUpJHNkX2xhbWJkYSkpCgpzZF80TiA8LSBsaXN0KGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NCAmIEVudj09Ik4iICYgU1I9PTEpJHNkX2xhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJOIiAmIFNSPT0yKSRzZF9sYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJOIiAmIFNSPT00KSRzZF9sYW1iZGEpLAogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT00ICYgRW52PT0iTiIgJiBTUj09NSkkc2RfbGFtYmRhKSkKCnNkXzVOIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT01ICYgRW52PT0iTiIgJiBTUj09MSkkc2RfbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09Ik4iICYgU1I9PTIpJHNkX2xhbWJkYSksICMgZm9jYWwgc3AgMgogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09Ik4iICYgU1I9PTQpJHNkX2xhbWJkYSksCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGE9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTUgJiBFbnY9PSJOIiAmIFNSPT01KSRzZF9sYW1iZGEpKQoKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT0xKSwiVHVfbGFtYmRhIl08LWMoY3hyX0MuUjEkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEtc2RfMU5bWzFdXSRsYW1iZGEsY3hyX0MuUjEkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEtc2RfMU5bWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9DX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DX2xvd2VyJFJlcGxpY2F0ZT09MSksIlRlX2xhbWJkYSJdPC1jKGN4cl9DLlIxJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzFOW1szXV0kbGFtYmRhLGN4cl9DLlIxJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzFOW1szXV0kbGFtYmRhLCBjeHJfQy5SMSRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF8xTltbNF1dJGxhbWJkYSxjeHJfQy5SMSRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF8xTltbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9DX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DX2xvd2VyJFJlcGxpY2F0ZT09MiksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlIyX3NyMSRmaXhlZF90ZXJtc1tbMV1dLXNkXzJOW1sxXV0kbGFtYmRhLGN4cl9DLlIyX3NyMSRmaXhlZF90ZXJtc1tbMV1dLXNkXzJOW1sxXV0kbGFtYmRhKQpjeHJfcGFyYW1fQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SMl9zcjQkZml4ZWRfdGVybXNbWzFdXS1zZF8yTltbMl1dJGxhbWJkYSxjeHJfQy5SMl9zcjUkZml4ZWRfdGVybXNbWzFdXS1zZF8yTltbM11dJGxhbWJkYSkKCmN4cl9wYXJhbV9DX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DX2xvd2VyJFJlcGxpY2F0ZT09MyksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlIzJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLXNkXzNOW1sxXV0kbGFtYmRhLGN4cl9DLlIzJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhLXNkXzNOW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ19sb3dlciRSZXBsaWNhdGU9PTMpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SMyRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF8zTltbM11dJGxhbWJkYSxjeHJfQy5SMyRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF8zTltbM11dJGxhbWJkYSwgY3hyX0MuUjMkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfM05bWzRdXSRsYW1iZGEsY3hyX0MuUjMkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfM05bWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ19sb3dlciRSZXBsaWNhdGU9PTQpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SNCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYS1zZF80TltbMV1dJGxhbWJkYSxjeHJfQy5SNCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYS1zZF80TltbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT00KSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjQkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfNE5bWzNdXSRsYW1iZGEsY3hyX0MuUjQkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfNE5bWzNdXSRsYW1iZGEsIGN4cl9DLlI0JGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzROW1s0XV0kbGFtYmRhLGN4cl9DLlI0JGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzROW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT01KSwiVHVfbGFtYmRhIl08LWMoY3hyX0MuUjUkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEtc2RfNU5bWzFdXSRsYW1iZGEsY3hyX0MuUjUkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEtc2RfNU5bWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9DX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DX2xvd2VyJFJlcGxpY2F0ZT09NSksIlRlX2xhbWJkYSJdPC1jKGN4cl9DLlI1JGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzVOW1szXV0kbGFtYmRhLGN4cl9DLlI1JGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzVOW1szXV0kbGFtYmRhLCBjeHJfQy5SNSRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF81TltbNF1dJGxhbWJkYSxjeHJfQy5SNSRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF81TltbNF1dJGxhbWJkYSkKCgpjeHJfcGFyYW1fQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SMV9pbnRyYSRhbHBoYV9tYXRyaXhbMSwxXS1jeHJfQy5SMV9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4WzIsMV0tY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMV0pLCAyKQpjeHJfcGFyYW1fQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SMV9pbnRyYSRhbHBoYV9tYXRyaXhbMywxXS1jeHJfQy5SMV9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4WzQsMV0tY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SMl9pbnRyYSRhbHBoYV9tYXRyaXhbMSwxXS1jeHJfQy5SMl9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSksIDIpCmN4cl9wYXJhbV9DX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DX2xvd2VyJFJlcGxpY2F0ZT09MiksIlRlX2ludHJhIl08LWMoY3hyX0MuUjJfaW50cmEkYWxwaGFfbWF0cml4WzIsMV0tY3hyX0MuUjJfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMV0sIGN4cl9DLlIyX2ludHJhJGFscGhhX21hdHJpeFszLDFdLWN4cl9DLlIyX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdKQoKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT0zKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjNfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0tY3hyX0MuUjNfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeFsyLDFdLWN4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdKSwgMikKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT0zKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjNfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0MuUjNfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeFs0LDFdLWN4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT00KSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjRfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0tY3hyX0MuUjRfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeFsyLDFdLWN4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdKSwgMikKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT00KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjRfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0MuUjRfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeFs0LDFdLWN4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT01KSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjVfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0tY3hyX0MuUjVfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeFsyLDFdLWN4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdKSwgMikKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT01KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjVfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0MuUjVfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeFs0LDFdLWN4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdKSwgZWFjaD0yKQoKCmN4cl9wYXJhbV9DX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DX2xvd2VyJFJlcGxpY2F0ZT09MSksIlR1X2ludGVyIl08LWMoY3hyX0MuUjEkYWxwaGFfbWF0cml4WzEsM10tY3hyX0MuUjEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlIxJGFscGhhX21hdHJpeFsyLDNdLWN4cl9DLlIxJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlIxJGFscGhhX21hdHJpeFsxLDRdLWN4cl9DLlIxJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SMSRhbHBoYV9tYXRyaXhbMiw0XS1jeHJfQy5SMSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT0xKSwiVGVfaW50ZXIiXTwtYyhjeHJfQy5SMSRhbHBoYV9tYXRyaXhbMywxXS1jeHJfQy5SMSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0MuUjEkYWxwaGFfbWF0cml4WzMsMl0tY3hyX0MuUjEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sY3hyX0MuUjEkYWxwaGFfbWF0cml4WzQsMV0tY3hyX0MuUjEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIGN4cl9DLlIxJGFscGhhX21hdHJpeFs0LDJdLWN4cl9DLlIxJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT0yKSwiVHVfaW50ZXIiXTwtYyhjeHJfQy5SMl9zcjEkYWxwaGFfaW50ZXJbMV0tY3hyX0MuUjJfc3IxJGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yWzFdLCBjeHJfQy5SMl9zcjEkYWxwaGFfaW50ZXJbMl0tY3hyX0MuUjJfc3IxJGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yWzJdKQpjeHJfcGFyYW1fQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIyX3NyNCRhbHBoYV9pbnRlclsxXS1jeHJfQy5SMl9zcjQkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMV0sIGN4cl9DLlIyX3NyNSRhbHBoYV9pbnRlclsxXS1jeHJfQy5SMl9zcjUkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMV0pCgpjeHJfcGFyYW1fQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ19sb3dlciRSZXBsaWNhdGU9PTMpLCJUdV9pbnRlciJdPC1jKGN4cl9DLlIzJGFscGhhX21hdHJpeFsxLDNdLWN4cl9DLlIzJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBjeHJfQy5SMyRhbHBoYV9tYXRyaXhbMiwzXS1jeHJfQy5SMyRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxjeHJfQy5SMyRhbHBoYV9tYXRyaXhbMSw0XS1jeHJfQy5SMyRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgY3hyX0MuUjMkYWxwaGFfbWF0cml4WzIsNF0tY3hyX0MuUjMkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV9DX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DX2xvd2VyJFJlcGxpY2F0ZT09MyksIlRlX2ludGVyIl08LWMoY3hyX0MuUjMkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0MuUjMkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9DLlIzJGFscGhhX21hdHJpeFszLDJdLWN4cl9DLlIzJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9DLlIzJGFscGhhX21hdHJpeFs0LDFdLWN4cl9DLlIzJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQy5SMyRhbHBoYV9tYXRyaXhbNCwyXS1jeHJfQy5SMyRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV9DX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DX2xvd2VyJFJlcGxpY2F0ZT09NCksIlR1X2ludGVyIl08LWMoY3hyX0MuUjQkYWxwaGFfbWF0cml4WzEsM10tY3hyX0MuUjQkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlI0JGFscGhhX21hdHJpeFsyLDNdLWN4cl9DLlI0JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlI0JGFscGhhX21hdHJpeFsxLDRdLWN4cl9DLlI0JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SNCRhbHBoYV9tYXRyaXhbMiw0XS1jeHJfQy5SNCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT00KSwiVGVfaW50ZXIiXTwtYyhjeHJfQy5SNCRhbHBoYV9tYXRyaXhbMywxXS1jeHJfQy5SNCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0MuUjQkYWxwaGFfbWF0cml4WzMsMl0tY3hyX0MuUjQkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sY3hyX0MuUjQkYWxwaGFfbWF0cml4WzQsMV0tY3hyX0MuUjQkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIGN4cl9DLlI0JGFscGhhX21hdHJpeFs0LDJdLWN4cl9DLlI0JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKY3hyX3BhcmFtX0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NfbG93ZXIkUmVwbGljYXRlPT01KSwiVHVfaW50ZXIiXTwtYyhjeHJfQy5SNSRhbHBoYV9tYXRyaXhbMSwzXS1jeHJfQy5SNSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgY3hyX0MuUjUkYWxwaGFfbWF0cml4WzIsM10tY3hyX0MuUjUkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sY3hyX0MuUjUkYWxwaGFfbWF0cml4WzEsNF0tY3hyX0MuUjUkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIGN4cl9DLlI1JGFscGhhX21hdHJpeFsyLDRdLWN4cl9DLlI1JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ19sb3dlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlI1JGFscGhhX21hdHJpeFszLDFdLWN4cl9DLlI1JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SNSRhbHBoYV9tYXRyaXhbMywyXS1jeHJfQy5SNSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SNSRhbHBoYV9tYXRyaXhbNCwxXS1jeHJfQy5SNSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjUkYWxwaGFfbWF0cml4WzQsMl0tY3hyX0MuUjUkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgojIyMgdXBwZXIKCmN4cl9wYXJhbV9DX3VwcGVyPC1leHBhbmQuZ3JpZChUdV9SZWdpbWU9YygiU1IxIiwgIlNSMiIpLCBUZV9SZWdpbWU9YygiU1I0IiwgIlNSNSIpLCBSZXBsaWNhdGU9YygxLDIsMyw0LDUpLCBFbnZpcm9ubWVudD1jKCJOIikpCmN4cl9wYXJhbV9DX3VwcGVyJFR1X2xhbWJkYTwtMApjeHJfcGFyYW1fQ191cHBlciRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX0NfdXBwZXIkVHVfaW50cmE8LTAKY3hyX3BhcmFtX0NfdXBwZXIkVGVfaW50cmE8LTAKY3hyX3BhcmFtX0NfdXBwZXIkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX0NfdXBwZXIkVGVfaW50ZXI8LTAKCiNyZW1vdmluZyBTUjIgZm9yIHJlcGxpY2F0ZSAyCmN4cl9wYXJhbV9DX3VwcGVyPC1jeHJfcGFyYW1fQ191cHBlclstd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT0yICYgY3hyX3BhcmFtX0NfdXBwZXIkVHVfUmVnaW1lPT0iU1IyIiksXQoKCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09MSksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlIxJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhK3NkXzFOW1sxXV0kbGFtYmRhLGN4cl9DLlIxJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhK3NkXzFOW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ191cHBlciRSZXBsaWNhdGU9PTEpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SMSRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF8xTltbM11dJGxhbWJkYSxjeHJfQy5SMSRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF8xTltbM11dJGxhbWJkYSwgY3hyX0MuUjEkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfMU5bWzRdXSRsYW1iZGEsY3hyX0MuUjEkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfMU5bWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ191cHBlciRSZXBsaWNhdGU9PTIpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SMl9zcjEkZml4ZWRfdGVybXNbWzFdXStzZF8yTltbMV1dJGxhbWJkYSxjeHJfQy5SMl9zcjEkZml4ZWRfdGVybXNbWzFdXStzZF8yTltbMV1dJGxhbWJkYSkKY3hyX3BhcmFtX0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT0yKSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjJfc3I0JGZpeGVkX3Rlcm1zW1sxXV0rc2RfMk5bWzJdXSRsYW1iZGEsY3hyX0MuUjJfc3I1JGZpeGVkX3Rlcm1zW1sxXV0rc2RfMk5bWzNdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SMyRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYStzZF8zTltbMV1dJGxhbWJkYSxjeHJfQy5SMyRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYStzZF8zTltbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT0zKSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjMkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfM05bWzNdXSRsYW1iZGEsY3hyX0MuUjMkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfM05bWzNdXSRsYW1iZGEsIGN4cl9DLlIzJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzNOW1s0XV0kbGFtYmRhLGN4cl9DLlIzJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzNOW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT00KSwiVHVfbGFtYmRhIl08LWMoY3hyX0MuUjQkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGErc2RfNE5bWzFdXSRsYW1iZGEsY3hyX0MuUjQkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGErc2RfNE5bWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09NCksIlRlX2xhbWJkYSJdPC1jKGN4cl9DLlI0JGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhK3NkXzROW1szXV0kbGFtYmRhLGN4cl9DLlI0JGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhK3NkXzROW1szXV0kbGFtYmRhLCBjeHJfQy5SNCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYStzZF80TltbNF1dJGxhbWJkYSxjeHJfQy5SNCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYStzZF80TltbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09NSksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlI1JGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhK3NkXzVOW1sxXV0kbGFtYmRhLGN4cl9DLlI1JGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhK3NkXzVOW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ191cHBlciRSZXBsaWNhdGU9PTUpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SNSRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF81TltbM11dJGxhbWJkYSxjeHJfQy5SNSRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF81TltbM11dJGxhbWJkYSwgY3hyX0MuUjUkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfNU5bWzRdXSRsYW1iZGEsY3hyX0MuUjUkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfNU5bWzRdXSRsYW1iZGEpCgoKY3hyX3BhcmFtX0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT0xKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0rY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9DLlIxX2ludHJhJGFscGhhX21hdHJpeFsyLDFdK2N4cl9DLlIxX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdKSwgMikKY3hyX3BhcmFtX0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0rY3hyX0MuUjFfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9DLlIxX2ludHJhJGFscGhhX21hdHJpeFs0LDFdK2N4cl9DLlIxX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT0yKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjJfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0rY3hyX0MuUjJfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0pLCAyKQpjeHJfcGFyYW1fQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ191cHBlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRyYSJdPC1jKGN4cl9DLlIyX2ludHJhJGFscGhhX21hdHJpeFsyLDFdK2N4cl9DLlIyX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdLCBjeHJfQy5SMl9pbnRyYSRhbHBoYV9tYXRyaXhbMywxXStjeHJfQy5SMl9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSkKCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09MyksIlR1X2ludHJhIl08LXJlcChjKGN4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeFsxLDFdK2N4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQy5SM19pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXStjeHJfQy5SM19pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwxXSksIDIpCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09MyksIlRlX2ludHJhIl08LXJlcChjKGN4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeFszLDFdK2N4cl9DLlIzX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SM19pbnRyYSRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQy5SM19pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSksIGVhY2g9MikKCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09NCksIlR1X2ludHJhIl08LXJlcChjKGN4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeFsxLDFdK2N4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQy5SNF9pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXStjeHJfQy5SNF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwxXSksIDIpCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09NCksIlRlX2ludHJhIl08LXJlcChjKGN4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeFszLDFdK2N4cl9DLlI0X2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SNF9pbnRyYSRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQy5SNF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSksIGVhY2g9MikKCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09NSksIlR1X2ludHJhIl08LXJlcChjKGN4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeFsxLDFdK2N4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQy5SNV9pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXStjeHJfQy5SNV9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwxXSksIDIpCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09NSksIlRlX2ludHJhIl08LXJlcChjKGN4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeFszLDFdK2N4cl9DLlI1X2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SNV9pbnRyYSRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQy5SNV9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSksIGVhY2g9MikKCgpjeHJfcGFyYW1fQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ191cHBlciRSZXBsaWNhdGU9PTEpLCJUdV9pbnRlciJdPC1jKGN4cl9DLlIxJGFscGhhX21hdHJpeFsxLDNdK2N4cl9DLlIxJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBjeHJfQy5SMSRhbHBoYV9tYXRyaXhbMiwzXStjeHJfQy5SMSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxjeHJfQy5SMSRhbHBoYV9tYXRyaXhbMSw0XStjeHJfQy5SMSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgY3hyX0MuUjEkYWxwaGFfbWF0cml4WzIsNF0rY3hyX0MuUjEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09MSksIlRlX2ludGVyIl08LWMoY3hyX0MuUjEkYWxwaGFfbWF0cml4WzMsMV0rY3hyX0MuUjEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9DLlIxJGFscGhhX21hdHJpeFszLDJdK2N4cl9DLlIxJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9DLlIxJGFscGhhX21hdHJpeFs0LDFdK2N4cl9DLlIxJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQy5SMSRhbHBoYV9tYXRyaXhbNCwyXStjeHJfQy5SMSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09MiksIlR1X2ludGVyIl08LWMoY3hyX0MuUjJfc3IxJGFscGhhX2ludGVyWzFdK2N4cl9DLlIyX3NyMSRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvclsxXSwgY3hyX0MuUjJfc3IxJGFscGhhX2ludGVyWzJdK2N4cl9DLlIyX3NyMSRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvclsyXSkKY3hyX3BhcmFtX0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT0yKSwiVGVfaW50ZXIiXTwtYyhjeHJfQy5SMl9zcjQkYWxwaGFfaW50ZXJbMV0rY3hyX0MuUjJfc3I0JGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yWzFdLCBjeHJfQy5SMl9zcjUkYWxwaGFfaW50ZXJbMV0rY3hyX0MuUjJfc3I1JGFscGhhX2ludGVyX3N0YW5kYXJkX2Vycm9yWzFdKQoKY3hyX3BhcmFtX0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT0zKSwiVHVfaW50ZXIiXTwtYyhjeHJfQy5SMyRhbHBoYV9tYXRyaXhbMSwzXStjeHJfQy5SMyRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwzXSwgY3hyX0MuUjMkYWxwaGFfbWF0cml4WzIsM10rY3hyX0MuUjMkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsM10sY3hyX0MuUjMkYWxwaGFfbWF0cml4WzEsNF0rY3hyX0MuUjMkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsNF0sIGN4cl9DLlIzJGFscGhhX21hdHJpeFsyLDRdK2N4cl9DLlIzJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDRdKQpjeHJfcGFyYW1fQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIzJGFscGhhX21hdHJpeFszLDFdK2N4cl9DLlIzJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SMyRhbHBoYV9tYXRyaXhbMywyXStjeHJfQy5SMyRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SMyRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQy5SMyRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjMkYWxwaGFfbWF0cml4WzQsMl0rY3hyX0MuUjMkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ191cHBlciRSZXBsaWNhdGU9PTQpLCJUdV9pbnRlciJdPC1jKGN4cl9DLlI0JGFscGhhX21hdHJpeFsxLDNdK2N4cl9DLlI0JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDNdLCBjeHJfQy5SNCRhbHBoYV9tYXRyaXhbMiwzXStjeHJfQy5SNCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwzXSxjeHJfQy5SNCRhbHBoYV9tYXRyaXhbMSw0XStjeHJfQy5SNCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSw0XSwgY3hyX0MuUjQkYWxwaGFfbWF0cml4WzIsNF0rY3hyX0MuUjQkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsNF0pCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09NCksIlRlX2ludGVyIl08LWMoY3hyX0MuUjQkYWxwaGFfbWF0cml4WzMsMV0rY3hyX0MuUjQkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9DLlI0JGFscGhhX21hdHJpeFszLDJdK2N4cl9DLlI0JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDJdLGN4cl9DLlI0JGFscGhhX21hdHJpeFs0LDFdK2N4cl9DLlI0JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdLCBjeHJfQy5SNCRhbHBoYV9tYXRyaXhbNCwyXStjeHJfQy5SNCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwyXSkKCmN4cl9wYXJhbV9DX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DX3VwcGVyJFJlcGxpY2F0ZT09NSksIlR1X2ludGVyIl08LWMoY3hyX0MuUjUkYWxwaGFfbWF0cml4WzEsM10rY3hyX0MuUjUkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlI1JGFscGhhX21hdHJpeFsyLDNdK2N4cl9DLlI1JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlI1JGFscGhhX21hdHJpeFsxLDRdK2N4cl9DLlI1JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SNSRhbHBoYV9tYXRyaXhbMiw0XStjeHJfQy5SNSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NfdXBwZXIkUmVwbGljYXRlPT01KSwiVGVfaW50ZXIiXTwtYyhjeHJfQy5SNSRhbHBoYV9tYXRyaXhbMywxXStjeHJfQy5SNSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0MuUjUkYWxwaGFfbWF0cml4WzMsMl0rY3hyX0MuUjUkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMl0sY3hyX0MuUjUkYWxwaGFfbWF0cml4WzQsMV0rY3hyX0MuUjUkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0sIGN4cl9DLlI1JGFscGhhX21hdHJpeFs0LDJdK2N4cl9DLlI1JGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDJdKQoKYGBgCgojIyMjIyMgZGF0YSB0YWJsZSBzdW1tYXJ5IGNhZG1pdW0KCmBgYHtyfQoKY3hyX3BhcmFtX0NDPC1leHBhbmQuZ3JpZChUdV9SZWdpbWU9YygiU1IxIiwgIlNSMiIpLCBUZV9SZWdpbWU9YygiU1I0IiwgIlNSNSIpLCBSZXBsaWNhdGU9YygxLDIsMyw0LDUpLCBFbnZpcm9ubWVudD1jKCJDZCIpKQpjeHJfcGFyYW1fQ0MkVHVfbGFtYmRhPC0wCmN4cl9wYXJhbV9DQyRUZV9sYW1iZGE8LTAKY3hyX3BhcmFtX0NDJFR1X2ludHJhPC0wCmN4cl9wYXJhbV9DQyRUZV9pbnRyYTwtMApjeHJfcGFyYW1fQ0MkVHVfaW50ZXI8LTAKY3hyX3BhcmFtX0NDJFRlX2ludGVyPC0wCgojcmVtb3ZpbmcgU1IyIGZvciByZXBsaWNhdGUgMgpjeHJfcGFyYW1fQ0M8LWN4cl9wYXJhbV9DQ1std2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09MiAmIGN4cl9wYXJhbV9DQyRUdV9SZWdpbWU9PSJTUjIiKSxdCgoKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTEpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SMV9jZCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYSxjeHJfQy5SMV9jZCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTEpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SMV9jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSxjeHJfQy5SMV9jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSwgY3hyX0MuUjFfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEsY3hyX0MuUjFfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09MiksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlIyX2NkX3NyMSRmaXhlZF90ZXJtc1tbMV1dLGN4cl9DLlIyX2NkX3NyMSRmaXhlZF90ZXJtc1tbMV1dKQpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09MiksIlRlX2xhbWJkYSJdPC1jKGN4cl9DLlIyX2NkX3NyNCRmaXhlZF90ZXJtc1tbMV1dLCBjeHJfQy5SMl9jZF9zcjUkZml4ZWRfdGVybXNbWzFdXSkKCmN4cl9wYXJhbV9DQ1t3aGljaChjeHJfcGFyYW1fQ0MkUmVwbGljYXRlPT0zKSwiVHVfbGFtYmRhIl08LWMoY3hyX0MuUjNfY2QkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEsY3hyX0MuUjNfY2QkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9DQ1t3aGljaChjeHJfcGFyYW1fQ0MkUmVwbGljYXRlPT0zKSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjNfY2QkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEsY3hyX0MuUjNfY2QkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEsIGN4cl9DLlIzX2NkJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLGN4cl9DLlIzX2NkJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTQpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SNF9jZCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYSxjeHJfQy5SNF9jZCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTQpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SNF9jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSxjeHJfQy5SNF9jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYSwgY3hyX0MuUjRfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEsY3hyX0MuUjRfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09NSksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlI1X2NkJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLGN4cl9DLlI1X2NkJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09NSksIlRlX2xhbWJkYSJdPC1jKGN4cl9DLlI1X2NkJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLGN4cl9DLlI1X2NkJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLCBjeHJfQy5SNV9jZCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSxjeHJfQy5SNV9jZCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYSkKCgpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09MSksIlR1X2ludHJhIl08LXJlcChjKGN4cl9DLlIxX2NkX2ludHJhJGFscGhhX21hdHJpeFsxLDFdLCBjeHJfQy5SMV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXSksIDIpCmN4cl9wYXJhbV9DQ1t3aGljaChjeHJfcGFyYW1fQ0MkUmVwbGljYXRlPT0xKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjFfY2RfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9DLlIxX2NkX2ludHJhJGFscGhhX21hdHJpeFs0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTIpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SMl9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMSwxXSksIDIpCmN4cl9wYXJhbV9DQ1t3aGljaChjeHJfcGFyYW1fQ0MkUmVwbGljYXRlPT0yKSwiVGVfaW50cmEiXTwtYyhjeHJfQy5SMl9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXSwgY3hyX0MuUjJfY2RfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0pCgpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09MyksIlR1X2ludHJhIl08LXJlcChjKGN4cl9DLlIzX2NkX2ludHJhJGFscGhhX21hdHJpeFsxLDFdLCBjeHJfQy5SM19jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXSksIDIpCmN4cl9wYXJhbV9DQ1t3aGljaChjeHJfcGFyYW1fQ0MkUmVwbGljYXRlPT0zKSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjNfY2RfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0sIGN4cl9DLlIzX2NkX2ludHJhJGFscGhhX21hdHJpeFs0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTQpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SNF9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMSwxXSwgY3hyX0MuUjRfY2RfaW50cmEkYWxwaGFfbWF0cml4WzIsMV0pLCAyKQpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09NCksIlRlX2ludHJhIl08LXJlcChjKGN4cl9DLlI0X2NkX2ludHJhJGFscGhhX21hdHJpeFszLDFdLCBjeHJfQy5SNF9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbNCwxXSksIGVhY2g9MikKCmN4cl9wYXJhbV9DQ1t3aGljaChjeHJfcGFyYW1fQ0MkUmVwbGljYXRlPT01KSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjVfY2RfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0sIGN4cl9DLlI1X2NkX2ludHJhJGFscGhhX21hdHJpeFsyLDFdKSwgMikKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTUpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SNV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMywxXSwgY3hyX0MuUjVfY2RfaW50cmEkYWxwaGFfbWF0cml4WzQsMV0pLCBlYWNoPTIpCgoKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTEpLCJUdV9pbnRlciJdPC1jKGN4cl9DLlIxX2NkJGFscGhhX21hdHJpeFsxLDNdLCBjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhbMiwzXSxjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhbMSw0XSwgY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4WzIsNF0pCmN4cl9wYXJhbV9DQ1t3aGljaChjeHJfcGFyYW1fQ0MkUmVwbGljYXRlPT0xKSwiVGVfaW50ZXIiXTwtYyhjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhbMywxXSwgY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4WzMsMl0sY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4WzQsMV0sIGN4cl9DLlIxX2NkJGFscGhhX21hdHJpeFs0LDJdKQoKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTIpLCJUdV9pbnRlciJdPC1jKGN4cl9DLlIyX2NkX3NyMSRhbHBoYV9pbnRlclsxXSwgY3hyX0MuUjJfY2Rfc3IxJGFscGhhX2ludGVyWzJdKQpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09MiksIlRlX2ludGVyIl08LWMoY3hyX0MuUjJfY2Rfc3I0JGFscGhhX2ludGVyWzFdLCBjeHJfQy5SMl9jZF9zcjUkYWxwaGFfaW50ZXJbMV0pCgpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09MyksIlR1X2ludGVyIl08LWMoY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4WzEsM10sIGN4cl9DLlIzX2NkJGFscGhhX21hdHJpeFsyLDNdLGN4cl9DLlIzX2NkJGFscGhhX21hdHJpeFsxLDRdLCBjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTMpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIzX2NkJGFscGhhX21hdHJpeFszLDFdLCBjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhbMywyXSxjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhbNCwxXSwgY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4WzQsMl0pCgpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09NCksIlR1X2ludGVyIl08LWMoY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4WzEsM10sIGN4cl9DLlI0X2NkJGFscGhhX21hdHJpeFsyLDNdLGN4cl9DLlI0X2NkJGFscGhhX21hdHJpeFsxLDRdLCBjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTQpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlI0X2NkJGFscGhhX21hdHJpeFszLDFdLCBjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhbMywyXSxjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhbNCwxXSwgY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4WzQsMl0pCgpjeHJfcGFyYW1fQ0Nbd2hpY2goY3hyX3BhcmFtX0NDJFJlcGxpY2F0ZT09NSksIlR1X2ludGVyIl08LWMoY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4WzEsM10sIGN4cl9DLlI1X2NkJGFscGhhX21hdHJpeFsyLDNdLGN4cl9DLlI1X2NkJGFscGhhX21hdHJpeFsxLDRdLCBjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhbMiw0XSkKY3hyX3BhcmFtX0NDW3doaWNoKGN4cl9wYXJhbV9DQyRSZXBsaWNhdGU9PTUpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlI1X2NkJGFscGhhX21hdHJpeFszLDFdLCBjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhbMywyXSxjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhbNCwxXSwgY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4WzQsMl0pCgojIyMgTG93ZXIKCmN4cl9wYXJhbV9DQ19sb3dlcjwtZXhwYW5kLmdyaWQoVHVfUmVnaW1lPWMoIlNSMSIsICJTUjIiKSwgVGVfUmVnaW1lPWMoIlNSNCIsICJTUjUiKSwgUmVwbGljYXRlPWMoMSwyLDMsNCw1KSwgRW52aXJvbm1lbnQ9YygiQ2QiKSkKY3hyX3BhcmFtX0NDX2xvd2VyJFR1X2xhbWJkYTwtMApjeHJfcGFyYW1fQ0NfbG93ZXIkVGVfbGFtYmRhPC0wCmN4cl9wYXJhbV9DQ19sb3dlciRUdV9pbnRyYTwtMApjeHJfcGFyYW1fQ0NfbG93ZXIkVGVfaW50cmE8LTAKY3hyX3BhcmFtX0NDX2xvd2VyJFR1X2ludGVyPC0wCmN4cl9wYXJhbV9DQ19sb3dlciRUZV9pbnRlcjwtMAoKI3JlbW92aW5nIFNSMiBmb3IgcmVwbGljYXRlIDIKY3hyX3BhcmFtX0NDX2xvd2VyPC1jeHJfcGFyYW1fQ0NfbG93ZXJbLXdoaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTIgJiBjeHJfcGFyYW1fQ0NfbG93ZXIkVHVfUmVnaW1lPT0iU1IyIiksXQoKI1NpbmNlIHRoZSBlcnJvciBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBkYXRhIHdlIG5lZWQgdG8gY3JlYXRlIHNvbWUgbGlzdHMgd2l0aCB0aGF0IGluZm9ybWF0aW9uCnNkXzFDIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iQ2QiICYgU1I9PTEpJHNkX2xhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTEgJiBFbnY9PSJDZCIgJiBTUj09Mikkc2RfbGFtYmRhKSwgIyBmb2NhbCBzcCAyCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iQ2QiICYgU1I9PTQpJHNkX2xhbWJkYSksCiAgICAgICAgICAgICAgICAgICAgbGlzdChsYW1iZGE9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTEgJiBFbnY9PSJDZCIgJiBTUj09NSkkc2RfbGFtYmRhKSkKCnNkXzJDIDwtIGxpc3QobGlzdChsYW1iZGEgPSBzdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0yICYgRW52PT0iQ2QiICYgU1I9PTEpJHNkX2xhbWJkYSApLCAjIGZvY2FsIHNwIDEKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTIgJiBFbnY9PSJDZCIgJiBTUj09NCkkc2RfbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MiAmIEVudj09IkNkIiAmIFNSPT01KSRzZF9sYW1iZGEpKQoKc2RfM0MgPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTMgJiBFbnY9PSJDZCIgJiBTUj09MSkkc2RfbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09IkNkIiAmIFNSPT0yKSRzZF9sYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTMgJiBFbnY9PSJDZCIgJiBTUj09NCkkc2RfbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09IkNkIiAmIFNSPT01KSRzZF9sYW1iZGEpKQoKc2RfNEMgPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJDZCIgJiBTUj09MSkkc2RfbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NCAmIEVudj09IkNkIiAmIFNSPT0yKSRzZF9sYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJDZCIgJiBTUj09NCkkc2RfbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NCAmIEVudj09IkNkIiAmIFNSPT01KSRzZF9sYW1iZGEpKQoKc2RfNUMgPC0gbGlzdChsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTUgJiBFbnY9PSJDZCIgJiBTUj09MSkkc2RfbGFtYmRhICksICMgZm9jYWwgc3AgMQogICAgICAgICAgICAgICAgICAgIGxpc3QobGFtYmRhID0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09IkNkIiAmIFNSPT0yKSRzZF9sYW1iZGEpLCAjIGZvY2FsIHNwIDIKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYSA9IHN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTUgJiBFbnY9PSJDZCIgJiBTUj09NCkkc2RfbGFtYmRhKSwKICAgICAgICAgICAgICAgICAgICBsaXN0KGxhbWJkYT0gc3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NSAmIEVudj09IkNkIiAmIFNSPT01KSRzZF9sYW1iZGEpKQoKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SMV9jZCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYS1zZF8xQ1tbMV1dJGxhbWJkYSxjeHJfQy5SMV9jZCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYS1zZF8xQ1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SMV9jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF8xQ1tbM11dJGxhbWJkYSxjeHJfQy5SMV9jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF8xQ1tbM11dJGxhbWJkYSwgY3hyX0MuUjFfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfMUNbWzRdXSRsYW1iZGEsY3hyX0MuUjFfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfMUNbWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09MiksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlIyX2NkX3NyMSRmaXhlZF90ZXJtcyRsYW1iZGEtc2RfMkNbWzFdXSRsYW1iZGEsY3hyX0MuUjJfY2Rfc3IxJGZpeGVkX3Rlcm1zJGxhbWJkYS1zZF8yQ1tbMV1dJGxhbWJkYSkKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SMl9jZF9zcjQkZml4ZWRfdGVybXMkbGFtYmRhLXNkXzJDW1syXV0kbGFtYmRhLGN4cl9DLlIyX2NkX3NyNSRmaXhlZF90ZXJtcyRsYW1iZGEtc2RfMkNbWzNdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09MyksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlIzX2NkJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhLXNkXzNDW1sxXV0kbGFtYmRhLGN4cl9DLlIzX2NkJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhLXNkXzNDW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09MyksIlRlX2xhbWJkYSJdPC1jKGN4cl9DLlIzX2NkJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzNDW1szXV0kbGFtYmRhLGN4cl9DLlIzX2NkJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhLXNkXzNDW1szXV0kbGFtYmRhLCBjeHJfQy5SM19jZCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF8zQ1tbNF1dJGxhbWJkYSxjeHJfQy5SM19jZCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYS1zZF8zQ1tbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9DQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ0NfbG93ZXIkUmVwbGljYXRlPT00KSwiVHVfbGFtYmRhIl08LWMoY3hyX0MuUjRfY2QkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGEtc2RfNENbWzFdXSRsYW1iZGEsY3hyX0MuUjRfY2QkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGEtc2RfNENbWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9DQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ0NfbG93ZXIkUmVwbGljYXRlPT00KSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjRfY2QkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfNENbWzNdXSRsYW1iZGEsY3hyX0MuUjRfY2QkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGEtc2RfNENbWzNdXSRsYW1iZGEsIGN4cl9DLlI0X2NkJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzRDW1s0XV0kbGFtYmRhLGN4cl9DLlI0X2NkJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhLXNkXzRDW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTUpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SNV9jZCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYS1zZF81Q1tbMV1dJGxhbWJkYSxjeHJfQy5SNV9jZCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYS1zZF81Q1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTUpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SNV9jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF81Q1tbM11dJGxhbWJkYSxjeHJfQy5SNV9jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYS1zZF81Q1tbM11dJGxhbWJkYSwgY3hyX0MuUjVfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfNUNbWzRdXSRsYW1iZGEsY3hyX0MuUjVfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGEtc2RfNUNbWzRdXSRsYW1iZGEpCgoKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SMV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMSwxXS1jeHJfQy5SMV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0MuUjFfY2RfaW50cmEkYWxwaGFfbWF0cml4WzIsMV0tY3hyX0MuUjFfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMV0pLCAyKQpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09MSksIlRlX2ludHJhIl08LXJlcChjKGN4cl9DLlIxX2NkX2ludHJhJGFscGhhX21hdHJpeFszLDFdLWN4cl9DLlIxX2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SMV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbNCwxXS1jeHJfQy5SMV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSksIGVhY2g9MikKCmN4cl9wYXJhbV9DQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ0NfbG93ZXIkUmVwbGljYXRlPT0yKSwiVHVfaW50cmEiXTwtY3hyX0MuUjJfY2RfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0tY3hyX0MuUjJfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0KY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRyYSJdPC1jKGN4cl9DLlIyX2NkX2ludHJhJGFscGhhX21hdHJpeFsyLDFdLWN4cl9DLlIyX2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdLCBjeHJfQy5SMl9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMywxXS1jeHJfQy5SMl9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSkKCmN4cl9wYXJhbV9DQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ0NfbG93ZXIkUmVwbGljYXRlPT0zKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjNfY2RfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0tY3hyX0MuUjNfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9DLlIzX2NkX2ludHJhJGFscGhhX21hdHJpeFsyLDFdLWN4cl9DLlIzX2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdKSwgMikKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SM19jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMywxXS1jeHJfQy5SM19jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0MuUjNfY2RfaW50cmEkYWxwaGFfbWF0cml4WzQsMV0tY3hyX0MuUjNfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09NCksIlR1X2ludHJhIl08LXJlcChjKGN4cl9DLlI0X2NkX2ludHJhJGFscGhhX21hdHJpeFsxLDFdLWN4cl9DLlI0X2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQy5SNF9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXS1jeHJfQy5SNF9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwxXSksIDIpCmN4cl9wYXJhbV9DQ19sb3dlclt3aGljaChjeHJfcGFyYW1fQ0NfbG93ZXIkUmVwbGljYXRlPT00KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjRfY2RfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0tY3hyX0MuUjRfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9DLlI0X2NkX2ludHJhJGFscGhhX21hdHJpeFs0LDFdLWN4cl9DLlI0X2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTUpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SNV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMSwxXS1jeHJfQy5SNV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0MuUjVfY2RfaW50cmEkYWxwaGFfbWF0cml4WzIsMV0tY3hyX0MuUjVfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMV0pLCAyKQpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09NSksIlRlX2ludHJhIl08LXJlcChjKGN4cl9DLlI1X2NkX2ludHJhJGFscGhhX21hdHJpeFszLDFdLWN4cl9DLlI1X2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SNV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbNCwxXS1jeHJfQy5SNV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSksIGVhY2g9MikKCgpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09MSksIlR1X2ludGVyIl08LWMoY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4WzEsM10tY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlIxX2NkJGFscGhhX21hdHJpeFsyLDNdLWN4cl9DLlIxX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlIxX2NkJGFscGhhX21hdHJpeFsxLDRdLWN4cl9DLlIxX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhbMiw0XS1jeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTEpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIxX2NkJGFscGhhX21hdHJpeFszLDFdLWN4cl9DLlIxX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhbMywyXS1jeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhbNCwxXS1jeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4WzQsMl0tY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09MiksIlR1X2ludGVyIl08LWMoY3hyX0MuUjJfY2Rfc3IxJGFscGhhX2ludGVyWzFdLWN4cl9DLlIyX2NkX3NyMSRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvclsxXSwgY3hyX0MuUjJfY2Rfc3IxJGFscGhhX2ludGVyWzJdLWN4cl9DLlIyX2NkX3NyMSRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvclsyXSkKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIyX2NkX3NyNCRhbHBoYV9pbnRlclsxXS1jeHJfQy5SMl9jZF9zcjQkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMV0sIGN4cl9DLlIyX2NkX3NyNSRhbHBoYV9pbnRlclsxXS1jeHJfQy5SMl9jZF9zcjUkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMV0pCgpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09MyksIlR1X2ludGVyIl08LWMoY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4WzEsM10tY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlIzX2NkJGFscGhhX21hdHJpeFsyLDNdLWN4cl9DLlIzX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlIzX2NkJGFscGhhX21hdHJpeFsxLDRdLWN4cl9DLlIzX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhbMiw0XS1jeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIzX2NkJGFscGhhX21hdHJpeFszLDFdLWN4cl9DLlIzX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhbMywyXS1jeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhbNCwxXS1jeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4WzQsMl0tY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09NCksIlR1X2ludGVyIl08LWMoY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4WzEsM10tY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlI0X2NkJGFscGhhX21hdHJpeFsyLDNdLWN4cl9DLlI0X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlI0X2NkJGFscGhhX21hdHJpeFsxLDRdLWN4cl9DLlI0X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhbMiw0XS1jeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlI0X2NkJGFscGhhX21hdHJpeFszLDFdLWN4cl9DLlI0X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhbMywyXS1jeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhbNCwxXS1jeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4WzQsMl0tY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQ0NfbG93ZXJbd2hpY2goY3hyX3BhcmFtX0NDX2xvd2VyJFJlcGxpY2F0ZT09NSksIlR1X2ludGVyIl08LWMoY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4WzEsM10tY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlI1X2NkJGFscGhhX21hdHJpeFsyLDNdLWN4cl9DLlI1X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlI1X2NkJGFscGhhX21hdHJpeFsxLDRdLWN4cl9DLlI1X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhbMiw0XS1jeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NDX2xvd2VyW3doaWNoKGN4cl9wYXJhbV9DQ19sb3dlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlI1X2NkJGFscGhhX21hdHJpeFszLDFdLWN4cl9DLlI1X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhbMywyXS1jeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhbNCwxXS1jeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4WzQsMl0tY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgojIyMgdXBwZXIKCmN4cl9wYXJhbV9DQ191cHBlcjwtZXhwYW5kLmdyaWQoVHVfUmVnaW1lPWMoIlNSMSIsICJTUjIiKSwgVGVfUmVnaW1lPWMoIlNSNCIsICJTUjUiKSwgUmVwbGljYXRlPWMoMSwyLDMsNCw1KSwgRW52aXJvbm1lbnQ9YygiQ2QiKSkKY3hyX3BhcmFtX0NDX3VwcGVyJFR1X2xhbWJkYTwtMApjeHJfcGFyYW1fQ0NfdXBwZXIkVGVfbGFtYmRhPC0wCmN4cl9wYXJhbV9DQ191cHBlciRUdV9pbnRyYTwtMApjeHJfcGFyYW1fQ0NfdXBwZXIkVGVfaW50cmE8LTAKY3hyX3BhcmFtX0NDX3VwcGVyJFR1X2ludGVyPC0wCmN4cl9wYXJhbV9DQ191cHBlciRUZV9pbnRlcjwtMAoKI3JlbW92aW5nIFNSMiBmb3IgcmVwbGljYXRlIDIKY3hyX3BhcmFtX0NDX3VwcGVyPC1jeHJfcGFyYW1fQ0NfdXBwZXJbLXdoaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTIgJiBjeHJfcGFyYW1fQ0NfdXBwZXIkVHVfUmVnaW1lPT0iU1IyIiksXQoKCmN4cl9wYXJhbV9DQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ0NfdXBwZXIkUmVwbGljYXRlPT0xKSwiVHVfbGFtYmRhIl08LWMoY3hyX0MuUjFfY2QkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGErc2RfMUNbWzFdXSRsYW1iZGEsY3hyX0MuUjFfY2QkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGErc2RfMUNbWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9DQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ0NfdXBwZXIkUmVwbGljYXRlPT0xKSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjFfY2QkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfMUNbWzNdXSRsYW1iZGEsY3hyX0MuUjFfY2QkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfMUNbWzNdXSRsYW1iZGEsIGN4cl9DLlIxX2NkJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzFDW1s0XV0kbGFtYmRhLGN4cl9DLlIxX2NkJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzFDW1s0XV0kbGFtYmRhKQoKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTIpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SMl9jZF9zcjEkZml4ZWRfdGVybXMkbGFtYmRhK3NkXzJDW1sxXV0kbGFtYmRhLGN4cl9DLlIyX2NkX3NyMSRmaXhlZF90ZXJtcyRsYW1iZGErc2RfMkNbWzFdXSRsYW1iZGEpCmN4cl9wYXJhbV9DQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ0NfdXBwZXIkUmVwbGljYXRlPT0yKSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjJfY2Rfc3I0JGZpeGVkX3Rlcm1zJGxhbWJkYStzZF8yQ1tbMl1dJGxhbWJkYSxjeHJfQy5SMl9jZF9zcjUkZml4ZWRfdGVybXMkbGFtYmRhK3NkXzJDW1szXV0kbGFtYmRhKQoKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUdV9sYW1iZGEiXTwtYyhjeHJfQy5SM19jZCRmaXhlZF90ZXJtc1tbMV1dJGxhbWJkYStzZF8zQ1tbMV1dJGxhbWJkYSxjeHJfQy5SM19jZCRmaXhlZF90ZXJtc1tbMl1dJGxhbWJkYStzZF8zQ1tbMl1dJGxhbWJkYSkKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUZV9sYW1iZGEiXTwtYyhjeHJfQy5SM19jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF8zQ1tbM11dJGxhbWJkYSxjeHJfQy5SM19jZCRmaXhlZF90ZXJtc1tbM11dJGxhbWJkYStzZF8zQ1tbM11dJGxhbWJkYSwgY3hyX0MuUjNfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfM0NbWzRdXSRsYW1iZGEsY3hyX0MuUjNfY2QkZml4ZWRfdGVybXNbWzRdXSRsYW1iZGErc2RfM0NbWzRdXSRsYW1iZGEpCgpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09NCksIlR1X2xhbWJkYSJdPC1jKGN4cl9DLlI0X2NkJGZpeGVkX3Rlcm1zW1sxXV0kbGFtYmRhK3NkXzRDW1sxXV0kbGFtYmRhLGN4cl9DLlI0X2NkJGZpeGVkX3Rlcm1zW1syXV0kbGFtYmRhK3NkXzRDW1syXV0kbGFtYmRhKQpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09NCksIlRlX2xhbWJkYSJdPC1jKGN4cl9DLlI0X2NkJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhK3NkXzRDW1szXV0kbGFtYmRhLGN4cl9DLlI0X2NkJGZpeGVkX3Rlcm1zW1szXV0kbGFtYmRhK3NkXzRDW1szXV0kbGFtYmRhLCBjeHJfQy5SNF9jZCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYStzZF80Q1tbNF1dJGxhbWJkYSxjeHJfQy5SNF9jZCRmaXhlZF90ZXJtc1tbNF1dJGxhbWJkYStzZF80Q1tbNF1dJGxhbWJkYSkKCmN4cl9wYXJhbV9DQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ0NfdXBwZXIkUmVwbGljYXRlPT01KSwiVHVfbGFtYmRhIl08LWMoY3hyX0MuUjVfY2QkZml4ZWRfdGVybXNbWzFdXSRsYW1iZGErc2RfNUNbWzFdXSRsYW1iZGEsY3hyX0MuUjVfY2QkZml4ZWRfdGVybXNbWzJdXSRsYW1iZGErc2RfNUNbWzJdXSRsYW1iZGEpCmN4cl9wYXJhbV9DQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ0NfdXBwZXIkUmVwbGljYXRlPT01KSwiVGVfbGFtYmRhIl08LWMoY3hyX0MuUjVfY2QkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfNUNbWzNdXSRsYW1iZGEsY3hyX0MuUjVfY2QkZml4ZWRfdGVybXNbWzNdXSRsYW1iZGErc2RfNUNbWzNdXSRsYW1iZGEsIGN4cl9DLlI1X2NkJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzVDW1s0XV0kbGFtYmRhLGN4cl9DLlI1X2NkJGZpeGVkX3Rlcm1zW1s0XV0kbGFtYmRhK3NkXzVDW1s0XV0kbGFtYmRhKQoKCmN4cl9wYXJhbV9DQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ0NfdXBwZXIkUmVwbGljYXRlPT0xKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjFfY2RfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0rY3hyX0MuUjFfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9DLlIxX2NkX2ludHJhJGFscGhhX21hdHJpeFsyLDFdK2N4cl9DLlIxX2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdKSwgMikKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTEpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SMV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMywxXStjeHJfQy5SMV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0MuUjFfY2RfaW50cmEkYWxwaGFfbWF0cml4WzQsMV0rY3hyX0MuUjFfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09MiksIlR1X2ludHJhIl08LWMoY3hyX0MuUjJfY2RfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0rY3hyX0MuUjJfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sY3hyX0MuUjJfY2RfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0rY3hyX0MuUjJfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0pCmN4cl9wYXJhbV9DQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ0NfdXBwZXIkUmVwbGljYXRlPT0yKSwiVGVfaW50cmEiXTwtYyhjeHJfQy5SMl9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXStjeHJfQy5SMl9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwxXSxjeHJfQy5SMl9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMywxXStjeHJfQy5SMl9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSkKCmN4cl9wYXJhbV9DQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ0NfdXBwZXIkUmVwbGljYXRlPT0zKSwiVHVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjNfY2RfaW50cmEkYWxwaGFfbWF0cml4WzEsMV0rY3hyX0MuUjNfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsMV0sIGN4cl9DLlIzX2NkX2ludHJhJGFscGhhX21hdHJpeFsyLDFdK2N4cl9DLlIzX2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDFdKSwgMikKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SM19jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMywxXStjeHJfQy5SM19jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywxXSwgY3hyX0MuUjNfY2RfaW50cmEkYWxwaGFfbWF0cml4WzQsMV0rY3hyX0MuUjNfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMV0pLCBlYWNoPTIpCgpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09NCksIlR1X2ludHJhIl08LXJlcChjKGN4cl9DLlI0X2NkX2ludHJhJGFscGhhX21hdHJpeFsxLDFdK2N4cl9DLlI0X2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDFdLCBjeHJfQy5SNF9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMiwxXStjeHJfQy5SNF9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiwxXSksIDIpCmN4cl9wYXJhbV9DQ191cHBlclt3aGljaChjeHJfcGFyYW1fQ0NfdXBwZXIkUmVwbGljYXRlPT00KSwiVGVfaW50cmEiXTwtcmVwKGMoY3hyX0MuUjRfY2RfaW50cmEkYWxwaGFfbWF0cml4WzMsMV0rY3hyX0MuUjRfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzMsMV0sIGN4cl9DLlI0X2NkX2ludHJhJGFscGhhX21hdHJpeFs0LDFdK2N4cl9DLlI0X2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvcls0LDFdKSwgZWFjaD0yKQoKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTUpLCJUdV9pbnRyYSJdPC1yZXAoYyhjeHJfQy5SNV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbMSwxXStjeHJfQy5SNV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMSwxXSwgY3hyX0MuUjVfY2RfaW50cmEkYWxwaGFfbWF0cml4WzIsMV0rY3hyX0MuUjVfY2RfaW50cmEkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzIsMV0pLCAyKQpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09NSksIlRlX2ludHJhIl08LXJlcChjKGN4cl9DLlI1X2NkX2ludHJhJGFscGhhX21hdHJpeFszLDFdK2N4cl9DLlI1X2NkX2ludHJhJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SNV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQy5SNV9jZF9pbnRyYSRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSksIGVhY2g9MikKCgpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09MSksIlR1X2ludGVyIl08LWMoY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4WzEsM10rY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlIxX2NkJGFscGhhX21hdHJpeFsyLDNdK2N4cl9DLlIxX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlIxX2NkJGFscGhhX21hdHJpeFsxLDRdK2N4cl9DLlIxX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhbMiw0XStjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTEpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIxX2NkJGFscGhhX21hdHJpeFszLDFdK2N4cl9DLlIxX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhbMywyXStjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQy5SMV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4WzQsMl0rY3hyX0MuUjFfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09MiksIlR1X2ludGVyIl08LWMoY3hyX0MuUjJfY2Rfc3IxJGFscGhhX2ludGVyWzFdK2N4cl9DLlIyX2NkX3NyMSRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvclsxXSwgY3hyX0MuUjJfY2Rfc3IxJGFscGhhX2ludGVyWzJdK2N4cl9DLlIyX2NkX3NyMSRhbHBoYV9pbnRlcl9zdGFuZGFyZF9lcnJvclsyXSkKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTIpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIyX2NkX3NyNCRhbHBoYV9pbnRlclsxXStjeHJfQy5SMl9jZF9zcjQkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMV0sIGN4cl9DLlIyX2NkX3NyNSRhbHBoYV9pbnRlclsxXStjeHJfQy5SMl9jZF9zcjUkYWxwaGFfaW50ZXJfc3RhbmRhcmRfZXJyb3JbMV0pCgpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09MyksIlR1X2ludGVyIl08LWMoY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4WzEsM10rY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlIzX2NkJGFscGhhX21hdHJpeFsyLDNdK2N4cl9DLlIzX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlIzX2NkJGFscGhhX21hdHJpeFsxLDRdK2N4cl9DLlIzX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhbMiw0XStjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTMpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlIzX2NkJGFscGhhX21hdHJpeFszLDFdK2N4cl9DLlIzX2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhbMywyXStjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQy5SM19jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4WzQsMl0rY3hyX0MuUjNfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09NCksIlR1X2ludGVyIl08LWMoY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4WzEsM10rY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlI0X2NkJGFscGhhX21hdHJpeFsyLDNdK2N4cl9DLlI0X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlI0X2NkJGFscGhhX21hdHJpeFsxLDRdK2N4cl9DLlI0X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhbMiw0XStjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTQpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlI0X2NkJGFscGhhX21hdHJpeFszLDFdK2N4cl9DLlI0X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhbMywyXStjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQy5SNF9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4WzQsMl0rY3hyX0MuUjRfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpjeHJfcGFyYW1fQ0NfdXBwZXJbd2hpY2goY3hyX3BhcmFtX0NDX3VwcGVyJFJlcGxpY2F0ZT09NSksIlR1X2ludGVyIl08LWMoY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4WzEsM10rY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzEsM10sIGN4cl9DLlI1X2NkJGFscGhhX21hdHJpeFsyLDNdK2N4cl9DLlI1X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsyLDNdLGN4cl9DLlI1X2NkJGFscGhhX21hdHJpeFsxLDRdK2N4cl9DLlI1X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclsxLDRdLCBjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhbMiw0XStjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMiw0XSkKY3hyX3BhcmFtX0NDX3VwcGVyW3doaWNoKGN4cl9wYXJhbV9DQ191cHBlciRSZXBsaWNhdGU9PTUpLCJUZV9pbnRlciJdPC1jKGN4cl9DLlI1X2NkJGFscGhhX21hdHJpeFszLDFdK2N4cl9DLlI1X2NkJGFscGhhX21hdHJpeF9zdGFuZGFyZF9lcnJvclszLDFdLCBjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhbMywyXStjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbMywyXSxjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhbNCwxXStjeHJfQy5SNV9jZCRhbHBoYV9tYXRyaXhfc3RhbmRhcmRfZXJyb3JbNCwxXSwgY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4WzQsMl0rY3hyX0MuUjVfY2QkYWxwaGFfbWF0cml4X3N0YW5kYXJkX2Vycm9yWzQsMl0pCgpgYGAKCgojIyMjIyBqb2luaW5nIGRhdGEgZnJhbWUKCmBgYHtyfQoKcGFyYW1fYWxsX0M8LWFzLmRhdGEuZnJhbWUocmJpbmQoY3hyX3BhcmFtX0MsIGN4cl9wYXJhbV9DQykpCgpwYXJhbV9hbGxfQ19sb3dlcjwtYXMuZGF0YS5mcmFtZShyYmluZChjeHJfcGFyYW1fQ19sb3dlciwgY3hyX3BhcmFtX0NDX2xvd2VyKSkKcGFyYW1fYWxsX0NfdXBwZXI8LWFzLmRhdGEuZnJhbWUocmJpbmQoY3hyX3BhcmFtX0NfdXBwZXIsIGN4cl9wYXJhbV9DQ191cHBlcikpCgoKcGFyYW1fYWxsX0NfbG93ZXIKcGFyYW1fYWxsX0NfdXBwZXIKCndyaXRlLmNzdihwYXJhbV9hbGxfQywgIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9uZXN0ZWQvcGFyYW1ldGVyc19jeHJfbGFtYmRhX2ZpeGVkLmNzdiIpCndyaXRlLmNzdihwYXJhbV9hbGxfQ191cHBlciwgIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9uZXN0ZWQvcGFyYW1ldGVyc19jeHJfbGFtYmRhX2ZpeGVkX3VwcGVyLmNzdiIpCndyaXRlLmNzdihwYXJhbV9hbGxfQ19sb3dlciwgIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9uZXN0ZWQvcGFyYW1ldGVyc19jeHJfbGFtYmRhX2ZpeGVkX2xvd2VyLmNzdiIpCgpgYGAKCgojIyMjIyBpbXBvcnRpbmcgZGF0YSBmcmFtZQoKYGBge3J9CgpwYXJhbV9hbGxfQzwtcmVhZC5jc3YoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9uZXN0ZWQvcGFyYW1ldGVyc19jeHJfbGFtYmRhX2ZpeGVkLmNzdiIpCnBhcmFtX2FsbF9DX3VwcGVyPC1yZWFkLmNzdigiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX25lc3RlZC9wYXJhbWV0ZXJzX2N4cl9sYW1iZGFfZml4ZWRfdXBwZXIuY3N2IikKcGFyYW1fYWxsX0NfbG93ZXI8LXJlYWQuY3N2KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbmVzdGVkL3BhcmFtZXRlcnNfY3hyX2xhbWJkYV9maXhlZF9sb3dlci5jc3YiKQoKcGFyYW1fYWxsX0M8LXBhcmFtX2FsbF9DWywtMV0KcGFyYW1fYWxsX0NfdXBwZXI8LXBhcmFtX2FsbF9DX3VwcGVyWywtMV0KcGFyYW1fYWxsX0NfbG93ZXI8LXBhcmFtX2FsbF9DX2xvd2VyWywtMV0KCmBgYAoKYGBge3J9CgpwYXJhbV9hbGxfQ19sb25nPC1nYXRoZXIocGFyYW1fYWxsX0MsIHBhcmFtZXRlciwgdmFsdWUsVHVfbGFtYmRhOlRlX2ludGVyICkKCnBhcmFtX2FsbF9DX2xvbmckY2F0ZWdvcnk8LW1hcHZhbHVlcyhwYXJhbV9hbGxfQ19sb25nJHBhcmFtZXRlciwgYygiVHVfbGFtYmRhIiwgIlRlX2xhbWJkYSIsICJUdV9pbnRyYSIsICJUZV9pbnRyYSIsIlR1X2ludGVyIiwgIlRlX2ludGVyIiksIGMoImxhbWJkYSIsICJsYW1iZGEiLCAiaW50cmEiLCAiaW50cmEiLCAiaW50ZXIiLCAiaW50ZXIiKSkKCnBhcmFtX2FsbF9DX2xvd2VyX2xvbmc8LWdhdGhlcihwYXJhbV9hbGxfQ19sb3dlciwgcGFyYW1ldGVyLCB2YWx1ZSxUdV9sYW1iZGE6VGVfaW50ZXIgKQoKcGFyYW1fYWxsX0NfbG93ZXJfbG9uZyRjYXRlZ29yeTwtbWFwdmFsdWVzKHBhcmFtX2FsbF9DX2xvd2VyX2xvbmckcGFyYW1ldGVyLCBjKCJUdV9sYW1iZGEiLCAiVGVfbGFtYmRhIiwgIlR1X2ludHJhIiwgIlRlX2ludHJhIiwiVHVfaW50ZXIiLCAiVGVfaW50ZXIiKSwgYygibGFtYmRhIiwgImxhbWJkYSIsICJpbnRyYSIsICJpbnRyYSIsICJpbnRlciIsICJpbnRlciIpKQoKcGFyYW1fYWxsX0NfdXBwZXJfbG9uZzwtZ2F0aGVyKHBhcmFtX2FsbF9DX3VwcGVyLCBwYXJhbWV0ZXIsIHZhbHVlLFR1X2xhbWJkYTpUZV9pbnRlciApCgpwYXJhbV9hbGxfQ191cHBlcl9sb25nJGNhdGVnb3J5PC1tYXB2YWx1ZXMocGFyYW1fYWxsX0NfdXBwZXJfbG9uZyRwYXJhbWV0ZXIsIGMoIlR1X2xhbWJkYSIsICJUZV9sYW1iZGEiLCAiVHVfaW50cmEiLCAiVGVfaW50cmEiLCJUdV9pbnRlciIsICJUZV9pbnRlciIpLCBjKCJsYW1iZGEiLCAibGFtYmRhIiwgImludHJhIiwgImludHJhIiwgImludGVyIiwgImludGVyIikpCgpjb2xuYW1lcyhwYXJhbV9hbGxfQ19sb3dlcl9sb25nKVs2XTwtImxvd2VyIgpjb2xuYW1lcyhwYXJhbV9hbGxfQ191cHBlcl9sb25nKVs2XTwtInVwcGVyIgoKc3RyKHBhcmFtX2FsbF9DX2xvbmcpCgpwYXJhbV9hbGxfQ19sb25nPC1jYmluZChwYXJhbV9hbGxfQ19sb25nWywxOjddLHBhcmFtX2FsbF9DX2xvd2VyX2xvbmckbG93ZXIsIHBhcmFtX2FsbF9DX3VwcGVyX2xvbmckdXBwZXIpCgpjb2xuYW1lcyhwYXJhbV9hbGxfQ19sb25nKVs4OjldPC1jKCJsb3dlciIsInVwcGVyIikKCgojIENvbXBhcmlzb24gY29udHJvbCB2cyBldm9sdmVkIHBlciBlbnZpcm9ubWVudApnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF9DX2xvbmcsIHBhcmFtZXRlcj09IlRlX2ludHJhIiAmIFR1X1JlZ2ltZT09IlNSMSIpLCBhZXMoeD1FbnZpcm9ubWVudCwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9uZXN0ZWQvcGFyYW1fUktfaW50cmFUZV93MF9yZXBfZW52LnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF9DX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludHJhIiAmIFRlX1JlZ2ltZT09IlNSNCIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9RW52aXJvbm1lbnQpKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gdXJ0aWNhZSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX25lc3RlZC9wYXJhbV9SS19pbnRyYVR1X3cwX3JlcF9lbnYucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF9DX2xvbmcsIHBhcmFtZXRlcj09IlRlX2ludGVyIiksIGFlcyh4PUVudmlyb25tZW50LCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGZhY2V0X2dyaWQoVHVfUmVnaW1lfi4sIGxhYmVsbGVyPWxhYmVsbGVyKFR1X1JlZ2ltZT1yZWdpbWVUdSwgVGVfUmVnaW1lPXJlZ2ltZVRlKSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyPSJkYXJrZ3JheSIpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludGVyc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIGV2YW5zaSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX25lc3RlZC9wYXJhbV9SS19pbnRlclRlX3cwX3JlcF9lbnYucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQocGFyYW1fYWxsX0NfbG9uZywgcGFyYW1ldGVyPT0iVHVfaW50ZXIiKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PUVudmlyb25tZW50KSkrCiAgZmFjZXRfZ3JpZChUZV9SZWdpbWV+LiwgbGFiZWxsZXI9bGFiZWxsZXIoVHVfUmVnaW1lPXJlZ2ltZVR1LCBUZV9SZWdpbWU9cmVnaW1lVGUpKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXI9ImRhcmtncmF5IikrCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC43NSkpKwogIHRoZW1lX2luZXMrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSxsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludGVyc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIHVydGljYWUpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9uZXN0ZWQvcGFyYW1fUktfaW50ZXJUdV93MF9yZXBfZW52LnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgoKZ2dwbG90KHN1YnNldChwYXJhbV9hbGxfQ19sb25nLCBwYXJhbWV0ZXI9PSJUZV9sYW1iZGEiICYgVHVfUmVnaW1lPT0iU1IxIiksIGFlcyh4PUVudmlyb25tZW50LCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyaW5zaWMgZ3Jvd3RoIHJhdGUgKFQuIGV2YW5zaSkiKSsKICB4bGFiKCJFbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX25lc3RlZC9wYXJhbV9SS19sYW1iZGFUZV93MF9yZXBfZW52LnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KHBhcmFtX2FsbF9DX2xvbmcsIHBhcmFtZXRlcj09IlR1X2xhbWJkYSIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PUVudmlyb25tZW50KSkrCiAgZ2VvbV9ib3hwbG90KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBvdXRsaWVyLmFscGhhID0wLjAxKSsKICBnZW9tX3BvaW50KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmluc2ljIGdyb3d0aCByYXRlIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL2N4cl9sYW1iZGFfZml4ZWRfbmVzdGVkL3BhcmFtX1JLX2xhbWJkYVR1X3cwX3JlcF9lbnYucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKYGBgCgojIyMjIFByZWRpY3RpbmcgZGVuc2l0aWVzCgpgYGB7cn0KCmRlbnNpdHlfYXV4PC1zZXEoMCwgMTAsIGJ5PSgxMC8xMDApKQoKcHJlZF9kZl9jeHJfQzwtYXMuZGF0YS5mcmFtZShleHBhbmRfZ3JpZChEZW5zaXR5PWRlbnNpdHlfYXV4LCBUdV9SZWdpbWU9YygiU1IxIiwiU1IyIiksIFRlX1JlZ2ltZT1jKCJTUjQiLCJTUjUiKSwgUmVwbGljYXRlPWMoMTo1KSwgRW52aXJvbm1lbnQ9YygiTiIsICJDZCIpKSkKCnByZWRfZGZfY3hyX0MkVHVfbWVhbl9pbnRyYTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJfQ1ssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfQywgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVHVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0MsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUdV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX0MsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFR1X2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfY3hyX0MkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQyRUdV9tZWFuX2ludGVyPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9DWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9DLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQywgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQywgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfY3hyX0MkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKCnByZWRfZGZfY3hyX0MkVHVfaW50cmFfTDwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJfQ1ssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfQ19sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVHVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0NfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUdV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX0NfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFR1X2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfY3hyX0MkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQyRUdV9pbnRlcl9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9DWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9DX2xvd2VyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQ19sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQ19sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfY3hyX0MkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQyRUdV9pbnRyYV9VPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9DWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9DX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQ191cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQ191cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9jeHJfQyREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX2N4cl9DJFR1X2ludGVyX1U8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfY3hyX0NbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX0NfdXBwZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF9DX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF9DX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUdV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9jeHJfQyREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX2N4cl9DJFRlX21lYW5faW50cmE8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfY3hyX0NbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX0MsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFRlX2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF9DLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF9DLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaSpwcmVkX2RmX2N4cl9DJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfY3hyX0MkVGVfbWVhbl9pbnRlcjwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJfQ1ssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfQywgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVGVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0MsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX0MsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipwcmVkX2RmX2N4cl9DJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfY3hyX0MkVGVfaW50cmFfTDwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9jeHJfQ1ssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChwYXJhbV9hbGxfQ19sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVGVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0NfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQocGFyYW1fYWxsX0NfbG93ZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfY3hyX0MkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQyRUZV9pbnRlcl9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9DWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9DX2xvd2VyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQ19sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQ19sb3dlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVGVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfY3hyX0MkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9jeHJfQyRUZV9pbnRyYV9VPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX2N4cl9DWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9DX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQ191cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQ191cHBlciwgRW52aXJvbm1lbnQ9PXByZWRfZGZfY3hyX0MkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVGVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9jeHJfQyREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX2N4cl9DJFRlX2ludGVyX1U8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfY3hyX0NbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX0NfdXBwZXIsIEVudmlyb25tZW50PT1wcmVkX2RmX2N4cl9DJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX2N4cl9DJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9jeHJfQyRSZXBsaWNhdGVbeF0pJFRlX2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF9DX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfY3hyX0MkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX2N4cl9DJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF9DX3VwcGVyLCBFbnZpcm9ubWVudD09cHJlZF9kZl9jeHJfQyRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9jeHJfQyRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfY3hyX0MkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9jeHJfQyREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgojIFJlbW92aW5nIFR1IGV2b2x2ZWQgcmVwbGljYXRlIDIgYmVjYXVzZSB0aGVyZSBpcyBubyBkYXRhCnByZWRfZGZfY3hyX0M8LXByZWRfZGZfY3hyX0NbLXdoaWNoKHByZWRfZGZfY3hyX0MkVHVfUmVnaW1lPT0iU1IyIiAmIHByZWRfZGZfY3hyX0MkUmVwbGljYXRlPT0yKSxdCgoKCiMgVHJhbnNmb3JtaW5nIGV2ZXJ5dGhpbmcgYmVsbG93IDAgaW50byAwIGZvciB0aGUgbG93ZXIgaW50ZXJ2YWwKCnByZWRfZGZfY3hyX0MkVGVfaW50ZXJfTFt3aGljaChwcmVkX2RmX2N4cl9DJFRlX2ludGVyX0w8MCldPC0wCnByZWRfZGZfY3hyX0MkVGVfaW50cmFfTFt3aGljaChwcmVkX2RmX2N4cl9DJFRlX2ludHJhX0w8MCldPC0wCnByZWRfZGZfY3hyX0MkVHVfaW50ZXJfTFt3aGljaChwcmVkX2RmX2N4cl9DJFR1X2ludGVyX0w8MCldPC0wCnByZWRfZGZfY3hyX0MkVHVfaW50cmFfTFt3aGljaChwcmVkX2RmX2N4cl9DJFR1X2ludHJhX0w8MCldPC0wCgp3aGljaChwcmVkX2RmX2N4cl9DJFRlX2ludGVyX0w+cHJlZF9kZl9jeHJfQyRUZV9pbnRlcl9VKQp3aGljaChwcmVkX2RmX2N4cl9DJFRlX2ludHJhX0w+cHJlZF9kZl9jeHJfQyRUZV9pbnRyYV9VKQoKcHJlZF9kZl9jeHJfQ1t3aGljaChwcmVkX2RmX2N4cl9DJFR1X2ludGVyX0w+cHJlZF9kZl9jeHJfQyRUdV9pbnRlcl9VKSxdCndoaWNoKHByZWRfZGZfY3hyX0MkVHVfaW50cmFfTD5wcmVkX2RmX2N4cl9DJFR1X2ludHJhX1UpCmBgYAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50cmFfTCwgeW1heD1UdV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIFQuIHVydGljYWUiKSsKICBnZ3RpdGxlKCJUdSBjb250cm9sIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCgoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iQ2QiICksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50cmFfTCwgeW1heD1UdV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iQ2QiICksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0xICYgRW52PT0iQ2QiICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIlR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKYGBgCgoKIyMjIyBQbG90dGluZyBwcmVkaWN0aW9ucwoKIyMjIyMgQ09OVFJPTCBJTlRSQQoKYGBge3J9CmNhJFJlcGxpY2F0ZTwtYXMuY2hhcmFjdGVyKGNhJFJlcCkKCnN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJOIiApCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludHJhX0wsIHltYXg9VHVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0xICYgRW52PT0iTiIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucy0xLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIFQuIHVydGljYWUiKSsKICBnZ3RpdGxlKCJUdSBjb250cm9sIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX25lc3RlZC9wcmVkX1R1X0lOVFJBX0NvbnRyb2xfd2F0ZXIucGRmIiwgd2lkdGg9MjUsIGhlaWdodD0xMCkKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09IkNkIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludHJhX0wsIHltYXg9VHVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09IkNkIiApLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MSAmIEVudj09IkNkIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLTEsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogICAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiBULiB1cnRpY2FlIikrCiAgZ2d0aXRsZSgiVHUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9uZXN0ZWQvcHJlZF9UdV9JTlRSQV9Db250cm9sX2NhZG1pdW0ucGRmIiwgd2lkdGg9MjUsIGhlaWdodD0xMCkKCiNzdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJDIiAmIFJlcGxpY2F0ZT09MykKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFRlX1JlZ2ltZT09IlNSNCIgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50cmFfTCwgeW1heD1UZV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLTEsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogICAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiBULiBldmFuc2kiKSsKICBnZ3RpdGxlKCJUZSBjb250cm9sIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9jeHJfbGFtYmRhX2ZpeGVkX25lc3RlZC9wcmVkX1RlX0lOVFJBX0NvbnRyb2xfY29udHJvbC5wZGYiLCB3aWR0aD0yNSwgaGVpZ2h0PTEwKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJDZCIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRyYV9MLCB5bWF4PVRlX2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJDZCIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucy0xLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICAgIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gVC4gZXZhbnNpIikrCiAgZ2d0aXRsZSgiVGUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvY3hyX2xhbWJkYV9maXhlZF9uZXN0ZWQvcHJlZF9UZV9JTlRSQV9Db250cm9sX2NhZG1pdW0ucGRmIiwgd2lkdGg9MjUsIGhlaWdodD0xMCkKCmBgYAoKIyMjIyMgQ09OVFJPTCBJTlRFUiB2cyBjb250cm9sCgpgYGB7cn0KZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09IlNSNCIpLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MSAmIEVudj09Ik4iICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09NCksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlR1ICYgVGUgY29udHJvbCBpbnRlcnNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgJiBUZSBjb250cm9sIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iTiIgJiBUdV9SZWdpbWU9PSJTUjEiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09IlNSMSIpLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NCAmIEVudj09Ik4iICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlICAmIFR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUdV9SZWdpbWU9PSJTUjEiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUdV9SZWdpbWU9PSJTUjEiKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0xKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgJiBUdSBjb250cm9sIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCiMjIyMjIENPTlRST0wgSU5URVIgdnMgZXZvbHZlZAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFR1X1JlZ2ltZT09IlNSMSIgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT0iU1I1IiksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50ZXJfTCwgeW1heD1UdV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0iU1IxIiAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTUpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBjb250cm9sICYgVGUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjEiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT01KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgY29udHJvbCAmIFRlIGV2b2x2ZWQgaW50ZXJzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUZV9SZWdpbWU9PSJTUjQiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09IlNSMiIpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFRlX1JlZ2ltZT09IlNSNCIgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT00ICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0yKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgY29udHJvbCAgJiBUdSBldm9sdmVkIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogICAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVGVfUmVnaW1lPT0iU1I0IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT00ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGNvbnRyb2wgICYgVHUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKYGBgCgojIyMjIyBDT05UUk9MIElOVFJBIGV2b2x2ZWQKCmBgYHtyfQpjYSRSZXBsaWNhdGU8LWFzLmNoYXJhY3RlcihjYSRSZXApCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludHJhX0wsIHltYXg9VHVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFR1X1JlZ2ltZT09IlNSMiIgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0yICYgRW52PT0iTiIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCBpbnRyYXNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0iU1IyIiAmIEVudmlyb25tZW50PT0iQ2QiICksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50cmFfTCwgeW1heD1UdV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0iU1IyIiAmIEVudmlyb25tZW50PT0iQ2QiICksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0yICYgRW52PT0iQ2QiICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlR1IGV2b2x2ZWQgaW50cmFzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50cmFfTCwgeW1heD1UZV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTUgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUZSBldm9sdmVkIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09IkNkIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludHJhX0wsIHltYXg9VGVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09IkNkIiApLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NSAmIEVudj09IkNkIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUZSBldm9sdmVkIGludHJhc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCiMjIyMjIEV2b2x2ZWQgSU5URVIgdnMgY29udHJvbAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFR1X1JlZ2ltZT09IlNSMiIgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT0iU1I0IiksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50ZXJfTCwgeW1heD1UdV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0iU1IyIiAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTQpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBldm9sdmVkICYgVGUgY29udHJvbCBpbnRlcnNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjQiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCAmIFRlIGNvbnRyb2wgaW50ZXJzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUZV9SZWdpbWU9PSJTUjUiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09IlNSMSIpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0iU1IxIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0xKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgZXZvbHZlZCAgJiBUdSBjb250cm9sIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogICAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IxIiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IxIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgJiBUdSBjb250cm9sIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCiMjIyMjIGV2b2x2ZWQgSU5URVIgdnMgZXZvbHZlZAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFR1X1JlZ2ltZT09IlNSMiIgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT0iU1I1IiksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50ZXJfTCwgeW1heD1UdV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVHVfUmVnaW1lPT0iU1IyIiAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTUpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBldm9sdmVkICYgVGUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUdV9SZWdpbWU9PSJTUjIiICYgRW52aXJvbm1lbnQ9PSJDZCIgJiBUZV9SZWdpbWU9PSJTUjUiKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT01KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCAmIFRlIGV2b2x2ZWQgaW50ZXJzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX2N4cl9DLCBUZV9SZWdpbWU9PSJTUjUiICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09IlNSMiIpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfY3hyX0MsIFRlX1JlZ2ltZT09IlNSNSIgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0yKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgZXZvbHZlZCAgJiBUdSBldm9sdmVkIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogICAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9jeHJfQywgVGVfUmVnaW1lPT0iU1I1IiAmIEVudmlyb25tZW50PT0iQ2QiICYgVHVfUmVnaW1lPT0iU1IyIiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgICYgVHUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKYGBgCgojIyMjIyBQcmVkaWN0ZWQgdnMgb2JzZXJ2ZWQKCmBgYHtyfQoKc3RyKHBhcmFtX2FsbF9DKQoKc3RyKGNhKQoKcmtfZnVuYzwtIGZ1bmN0aW9uKGxhbWJkYSwgYWxwaGFfaWksIGFscGhhX2lqLCBkZW5zX2ksIGRlbnNfaiwgLi4uKXsKICBncjwtbGFtYmRhKmV4cCgtYWxwaGFfaWkqZGVuc19pIC0gYWxwaGFfaWoqZGVuc19qKQogIAogIHJldHVybihncikKfQoKcmVkX2NhX0M8LWNhWyxjKCJFbnYiLCAiUmVwIiwgIkZvY2FsU1IiLCAiQ29tcFNSIiwgIkRlbnMiLCAiVHlwZSIsICJUZUZlbWFsZXMiLCAiVHVGZW1hbGVzIiwgIkdyb3d0aFJhdGVPQSIpXQoKcmVkX2NhX0MKCnJlZF9jYV9DJERlbnNfRm9jYWw8LXNhcHBseShjKDE6bGVuZ3RoKHJlZF9jYV9DWywxXSkpLCBmdW5jdGlvbih4KXsKICBpZihyZWRfY2FfQyRUeXBlW3hdPT0iSU5UUkEiKXsKICAgIGE8LXJlZF9jYV9DJERlbnNbeF0tMQogIH1lbHNlIGlmKHJlZF9jYV9DJFR5cGVbeF09PSJJTlRFUiIpewogICAgYTwtMQogIH0KICAKICBhCn0pCgpyZWRfY2FfQyREZW5zX0NvbXA8LXNhcHBseShjKDE6bGVuZ3RoKHJlZF9jYV9DWywxXSkpLCBmdW5jdGlvbih4KXsKICBpZihyZWRfY2FfQyRUeXBlW3hdPT0iSU5UUkEiKXsKICAgIGE8LTAKICB9ZWxzZSBpZihyZWRfY2FfQyRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGE8LXJlZF9jYV9DJERlbnNbeF0tMQogIH0KICAKICBhCn0pCgpyZWRfY2FfQyRGb2NhbDwtbWFwdmFsdWVzKHJlZF9jYV9DJEZvY2FsU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCAiU1I1IikpCnJlZF9jYV9DJENvbXA8LW1hcHZhbHVlcyhyZWRfY2FfQyRDb21wU1IsIGMoMSwyLDQsNSksIGMoIlNSMSIsICJTUjIiLCJTUjQiLCAiU1I1IikpCgpyZWRfY2FfQyRwcmVkPC1zYXBwbHkoYygxOmxlbmd0aChyZWRfY2FfQ1ssMV0pKSwgZnVuY3Rpb24oeCl7CiAgCiAgaWYocmVkX2NhX0MkRm9jYWxbeF09PSJTUjEiIHwgcmVkX2NhX0MkRm9jYWxbeF09PSJTUjIiKXsKICAgIGF1eF9kYXRhPC1zdWJzZXQocGFyYW1fYWxsX0MsIEVudmlyb25tZW50PT1yZWRfY2FfQyRFbnZbeF0gJiBSZXBsaWNhdGU9PSByZWRfY2FfQyRSZXBbeF0gJiBhcy5jaGFyYWN0ZXIoVHVfUmVnaW1lKT09cmVkX2NhX0MkRm9jYWxbeF0pCiAgICAKICAgIGF1eF9wcmVkPC1ya19mdW5jKGxhbWJkYT1hdXhfZGF0YSRUdV9sYW1iZGFbMV0sIGFscGhhX2lpID1hdXhfZGF0YSRUdV9pbnRyYVsxXSwgYWxwaGFfaWogPSBhdXhfZGF0YSRUdV9pbnRlclsxXSwgZGVuc19pID0gcmVkX2NhX0MkRGVuc19Gb2NhbFt4XSwgZGVuc19qID0gIHJlZF9jYV9DJERlbnNfQ29tcFt4XSkKICAgIAogIH1lbHNlIGlmKHJlZF9jYV9DJEZvY2FsW3hdPT0iU1I0IiB8IHJlZF9jYV9DJEZvY2FsW3hdPT0iU1I1Iil7CiAgICBhdXhfZGF0YTwtc3Vic2V0KHBhcmFtX2FsbF9DLCBFbnZpcm9ubWVudD09cmVkX2NhX0MkRW52W3hdICYgUmVwbGljYXRlPT0gcmVkX2NhX0MkUmVwW3hdICYgYXMuY2hhcmFjdGVyKFRlX1JlZ2ltZSk9PXJlZF9jYV9DJEZvY2FsW3hdKQogICAgCiAgICBhdXhfcHJlZDwtcmtfZnVuYyhsYW1iZGE9YXV4X2RhdGEkVGVfbGFtYmRhWzFdLCBhbHBoYV9paSA9YXV4X2RhdGEkVGVfaW50cmFbMV0sIGFscGhhX2lqID0gYXV4X2RhdGEkVGVfaW50ZXJbMV0sIGRlbnNfaSA9IHJlZF9jYV9DJERlbnNfRm9jYWxbeF0sIGRlbnNfaiA9ICByZWRfY2FfQyREZW5zX0NvbXBbeF0pCiAgfQogIAogIGF1eF9wcmVkCn0pCgpyZWRfY2FfQyRwcmVkX0w8LXNhcHBseShjKDE6bGVuZ3RoKHJlZF9jYV9DWywxXSkpLCBmdW5jdGlvbih4KXsKICAKICBpZihyZWRfY2FfQyRGb2NhbFt4XT09IlNSMSIgfCByZWRfY2FfQyRGb2NhbFt4XT09IlNSMiIpewogICAgYXV4X2RhdGE8LXN1YnNldChwYXJhbV9hbGxfQ19sb3dlciwgRW52aXJvbm1lbnQ9PXJlZF9jYV9DJEVudlt4XSAmIFJlcGxpY2F0ZT09IHJlZF9jYV9DJFJlcFt4XSAmIGFzLmNoYXJhY3RlcihUdV9SZWdpbWUpPT1yZWRfY2FfQyRGb2NhbFt4XSkKICAgIAogICAgYXV4X3ByZWQ8LXJrX2Z1bmMobGFtYmRhPWF1eF9kYXRhJFR1X2xhbWJkYVsxXSwgYWxwaGFfaWkgPWF1eF9kYXRhJFR1X2ludHJhWzFdLCBhbHBoYV9paiA9IGF1eF9kYXRhJFR1X2ludGVyWzFdLCBkZW5zX2kgPSByZWRfY2FfQyREZW5zX0ZvY2FsW3hdLCBkZW5zX2ogPSAgcmVkX2NhX0MkRGVuc19Db21wW3hdKQogICAgCiAgfWVsc2UgaWYocmVkX2NhX0MkRm9jYWxbeF09PSJTUjQiIHwgcmVkX2NhX0MkRm9jYWxbeF09PSJTUjUiKXsKICAgIGF1eF9kYXRhPC1zdWJzZXQocGFyYW1fYWxsX0NfbG93ZXIsIEVudmlyb25tZW50PT1yZWRfY2FfQyRFbnZbeF0gJiBSZXBsaWNhdGU9PSByZWRfY2FfQyRSZXBbeF0gJiBhcy5jaGFyYWN0ZXIoVGVfUmVnaW1lKT09cmVkX2NhX0MkRm9jYWxbeF0pCiAgICAKICAgIGF1eF9wcmVkPC1ya19mdW5jKGxhbWJkYT1hdXhfZGF0YSRUZV9sYW1iZGFbMV0sIGFscGhhX2lpID1hdXhfZGF0YSRUZV9pbnRyYVsxXSwgYWxwaGFfaWogPSBhdXhfZGF0YSRUZV9pbnRlclsxXSwgZGVuc19pID0gcmVkX2NhX0MkRGVuc19Gb2NhbFt4XSwgZGVuc19qID0gIHJlZF9jYV9DJERlbnNfQ29tcFt4XSkKICB9CiAgCiAgYXV4X3ByZWQKfSkKCnJlZF9jYV9DJHByZWRfVTwtc2FwcGx5KGMoMTpsZW5ndGgocmVkX2NhX0NbLDFdKSksIGZ1bmN0aW9uKHgpewogIAogIGlmKHJlZF9jYV9DJEZvY2FsW3hdPT0iU1IxIiB8IHJlZF9jYV9DJEZvY2FsW3hdPT0iU1IyIil7CiAgICBhdXhfZGF0YTwtc3Vic2V0KHBhcmFtX2FsbF9DX3VwcGVyLCBFbnZpcm9ubWVudD09cmVkX2NhX0MkRW52W3hdICYgUmVwbGljYXRlPT0gcmVkX2NhX0MkUmVwW3hdICYgYXMuY2hhcmFjdGVyKFR1X1JlZ2ltZSk9PXJlZF9jYV9DJEZvY2FsW3hdKQogICAgCiAgICBhdXhfcHJlZDwtcmtfZnVuYyhsYW1iZGE9YXV4X2RhdGEkVHVfbGFtYmRhWzFdLCBhbHBoYV9paSA9YXV4X2RhdGEkVHVfaW50cmFbMV0sIGFscGhhX2lqID0gYXV4X2RhdGEkVHVfaW50ZXJbMV0sIGRlbnNfaSA9IHJlZF9jYV9DJERlbnNfRm9jYWxbeF0sIGRlbnNfaiA9ICByZWRfY2FfQyREZW5zX0NvbXBbeF0pCiAgICAKICB9ZWxzZSBpZihyZWRfY2FfQyRGb2NhbFt4XT09IlNSNCIgfCByZWRfY2FfQyRGb2NhbFt4XT09IlNSNSIpewogICAgYXV4X2RhdGE8LXN1YnNldChwYXJhbV9hbGxfQ191cHBlciwgRW52aXJvbm1lbnQ9PXJlZF9jYV9DJEVudlt4XSAmIFJlcGxpY2F0ZT09IHJlZF9jYV9DJFJlcFt4XSAmIGFzLmNoYXJhY3RlcihUZV9SZWdpbWUpPT1yZWRfY2FfQyRGb2NhbFt4XSkKICAgIAogICAgYXV4X3ByZWQ8LXJrX2Z1bmMobGFtYmRhPWF1eF9kYXRhJFRlX2xhbWJkYVsxXSwgYWxwaGFfaWkgPWF1eF9kYXRhJFRlX2ludHJhWzFdLCBhbHBoYV9paiA9IGF1eF9kYXRhJFRlX2ludGVyWzFdLCBkZW5zX2kgPSByZWRfY2FfQyREZW5zX0ZvY2FsW3hdLCBkZW5zX2ogPSAgcmVkX2NhX0MkRGVuc19Db21wW3hdKQogIH0KICAKICBhdXhfcHJlZAp9KQoKcmVkX2NhX0MkUmVwbGljYXRlPC1yZWRfY2FfQyRSZXAKc3RyKHJlZF9jYV9DKQoKCmdncGxvdChzdWJzZXQocmVkX2NhX0MsIEVudj09Ik4iICYgRm9jYWxTUj09MSksIGFlcyh4PWxvZyhHcm93dGhSYXRlT0ErMSksIHk9bG9nKHByZWQrMSkpKSsKICBmYWNldF9ncmlkKENvbXBTUn5SZXBsaWNhdGUpKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0PTApKwogIGdlb21fcG9pbnQoKSsKICB5bGFiKCJQcmVkaWN0ZWQiKSsKICB4bGFiKCJPYnNlcnZlZCIpKwogIGdndGl0bGUoIk5vcm1hbCBlbnZpcm9ubWVudCBDb250cm9sIHVydGljYWUiKQoKZ2dwbG90KHN1YnNldChyZWRfY2FfQywgRW52PT0iTiIgJiBGb2NhbFNSPT0xKSwgYWVzKHg9R3Jvd3RoUmF0ZU9BLCB5PXByZWQpKSsKICBmYWNldF9ncmlkKENvbXBTUn5SZXBsaWNhdGUpKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0PTApKwogIGdlb21fcG9pbnQoKSsKICB5bGFiKCJQcmVkaWN0ZWQiKSsKICB4bGFiKCJPYnNlcnZlZCIpKwogIGdndGl0bGUoIk5vcm1hbCBlbnZpcm9ubWVudCBDb250cm9sIHVydGljYWUiKQoKCgpgYGAKCiMjIyBEIC0gb3B0aW0gbm9ybWFsCgojIyMjIyBFc3RpbWF0aW5nIHBhcmFtZXRlcnMKCmBgYHtyfQoKIyBjcmVhdGluZyBmb2xkZXIgdG8gcHV0IHRoZSBhbmFseXNlcyBpbnNpZGUsIHRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBmaWxlIHBhdGggaW4gdGhlIGZ1bmN0aW9uCmRpci5jcmVhdGUoIi4vTmV3QW5hbHlzZXMvT3B0aW1fbm9ybWFsIiwgc2hvd1dhcm5pbmdzID0gRkFMU0UpCgpzb3VyY2UoIi4vZnVuY3Rpb25fcmlrZXJfMjdNYXkuUiIpCiMgVGhpcyBtYXRyaXggaGFzIGFsbCB0aGUgY29tcGFyaXNvbnMgdGhhdCBuZWVkIHRvIGJlIGRvbmUgYmV0d2VlbiByZWdpbWVzCmNvbXBhcmlzb25fbWF0PC1tYXRyaXgobnJvdz00LCBuY29sPTMpCiAgY29tcGFyaXNvbl9tYXRbMSxdPC1jKDEsNCw1KQogIGNvbXBhcmlzb25fbWF0WzIsXTwtYygyLDQsNSkKICBjb21wYXJpc29uX21hdFszLF08LWMoNCwxLDIpCiAgY29tcGFyaXNvbl9tYXRbNCxdPC1jKDUsMSwyKQoKI2xhbTIgaXMgdGhlIGRhdGEgZnJvbSBkZW5zaXR5IG9uZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb2NhbHMgcG9wdWxhdGlvbnMKIyBkYXRhMiBpcyB0aGUgZGF0YSAoZm9ybWF0KSBSZWdpbWUgKG5hbWUgb2YgZm9jYWwgcG9wKSwgYmFja2dyb3VuZCAobmFtZSBvZiBjb21wZXRpdG9yLCB0aGUgc2FtZSBpZiBpdHMgaW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiksIGZvY2FsIChudW1iZXIgb2YgZm9jYWwgaW5kaXZpZHVhbHMgaW4gZzApLCBjb21wIChudW1iZXIgb2YgY29tcGV0aXRvcnMgaW4gZzApLCBncm93dGggcmF0ZQogICMgQXR0ZW50aW9uIHRoYXQgZm9yIGludHJhc3BlY2lmaWMgeW91IG5lZWQgdG8gYWRkIDAgaW4gdGhlIGNvbXAgYW5kIGFsbCBpbmRpdmlkdWFscyBpbiB0aGUgZm9jYWwKICAKICAKCnJlcDI8LW1vZF9kZihzdWJzZXQoY2EsUmVwPT0xICYgRW52PT0iTiIpKSAgCm1hZ2ljX3JrKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLGRhdGEyPXJlcDIsIHJlcHMyPTEsIGVudj0iTiIsIGNvbXBhcmlzb25zID0gY29tcGFyaXNvbl9tYXQpCgpyZXAyPC1tb2RfZGYoc3Vic2V0KGNhLFJlcD09MSAmIEVudj09IkNkIikpCm1hZ2ljX3JrKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBsYW0yPWRhdGFGb3JMYW1iZGEsIGRhdGEyPXJlcDIsIHJlcHMyPTEsIGVudj0iQ2QiLCBjb21wYXJpc29ucyA9IGNvbXBhcmlzb25fbWF0KQoKcmVwMjwtbW9kX2RmKHN1YnNldChjYSxSZXA9PTMgJiBFbnY9PSJOIikpCm1hZ2ljX3JrKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBsYW0yPWRhdGFGb3JMYW1iZGEsIGRhdGEyPXJlcDIsIHJlcHMyPTMsIGVudj0iTiIsIGNvbXBhcmlzb25zID0gY29tcGFyaXNvbl9tYXQpCgpyZXAyPC1tb2RfZGYoc3Vic2V0KGNhLFJlcD09MyAmIEVudj09IkNkIikpCm1hZ2ljX3JrKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBsYW0yPWRhdGFGb3JMYW1iZGEsIGRhdGEyPXJlcDIsIHJlcHMyPTMsIGVudj0iQ2QiLCBjb21wYXJpc29ucyA9IGNvbXBhcmlzb25fbWF0KQoKcmVwMjwtbW9kX2RmKHN1YnNldChjYSxSZXA9PTQgJiBFbnY9PSJOIikpCm1hZ2ljX3JrKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBsYW0yPWRhdGFGb3JMYW1iZGEsIGRhdGEyPXJlcDIsIHJlcHMyPTQsIGVudj0iTiIsIGNvbXBhcmlzb25zID0gY29tcGFyaXNvbl9tYXQpCgpyZXAyPC1tb2RfZGYoc3Vic2V0KGNhLFJlcD09NCAmIEVudj09IkNkIikpCm1hZ2ljX3JrKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBsYW0yPWRhdGFGb3JMYW1iZGEsIGRhdGEyPXJlcDIsIHJlcHMyPTQsIGVudj0iQ2QiLCBjb21wYXJpc29ucyA9IGNvbXBhcmlzb25fbWF0KQoKcmVwMjwtbW9kX2RmKHN1YnNldChjYSxSZXA9PTUgJiBFbnY9PSJOIikpCm1hZ2ljX3JrKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBsYW0yPWRhdGFGb3JMYW1iZGEsIGRhdGEyPXJlcDIsIHJlcHMyPTUsIGVudj0iTiIsIGNvbXBhcmlzb25zID0gY29tcGFyaXNvbl9tYXQpCgpyZXAyPC1tb2RfZGYoc3Vic2V0KGNhLFJlcD09NSAmIEVudj09IkNkIikpCm1hZ2ljX3JrKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBsYW0yPWRhdGFGb3JMYW1iZGEsIGRhdGEyPXJlcDIsIHJlcHMyPTUsIGVudj0iQ2QiLCBjb21wYXJpc29ucyA9IGNvbXBhcmlzb25fbWF0KQoKIyBGb3IgdHdvIHdlIGhhdmUgdG8gY2hhbmdlIHRoZSBjb21wYXJpc29uIG1hdHJpeApjb21wYXJpc29uX21hdDI8LW1hdHJpeChucm93PTMsIG5jb2w9MykKICBjb21wYXJpc29uX21hdDJbMSxdPC1jKDEsNCw1KQogIGNvbXBhcmlzb25fbWF0MlsyLF08LWMoNCwxLE5BKQogIGNvbXBhcmlzb25fbWF0MlszLF08LWMoNSwxLE5BKQoKcmVwMjwtbW9kX2RmKHN1YnNldChjYSxSZXA9PTIgJiBFbnY9PSJOIikpCm1hZ2ljX3JrKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBsYW0yPWRhdGFGb3JMYW1iZGEsIGRhdGEyPXJlcDIsIHJlcHMyPTIsIGVudj0iTiIsIGNvbXBhcmlzb25zID0gY29tcGFyaXNvbl9tYXQyKQoKcmVwMjwtbW9kX2RmKHN1YnNldChjYSxSZXA9PTIgJiBFbnY9PSJDZCIpKQptYWdpY19yayhmaWxlcGF0aDIgPSAiLi9OZXdBbmFseXNlcy9PcHRpbV9ub3JtYWwvIiwgbGFtMj1kYXRhRm9yTGFtYmRhLCBkYXRhMj1yZXAyLCByZXBzMj0yLCBlbnY9IkNkIiwgY29tcGFyaXNvbnMgPSBjb21wYXJpc29uX21hdDIpCgpgYGAKCiMjIyMjIEltcG9ydGluZyBmaWxlcyBvZiBhbHBoYSBhbmQgbGFtYmRhCgpgYGB7cn0KYWxwaGFfZmlsZTwtbGlzdC5maWxlcygiLi9OZXdBbmFseXNlcy9PcHRpbV9ub3JtYWwvIiwgcGF0dGVybj0iYWxwaGFfZXN0aW1hdGVzIikgI3RoZSBhbHBoYXMgYXJlIGFsd2F5cyB0dSwgdGUgKHJvdyksIHR1LCB0ZSAoY29sKQoKYWxwaGFVcHBlcl9maWxlPC1saXN0LmZpbGVzKCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBwYXR0ZXJuPSJhbHBoYV91cHBlciIpCgphbHBoYUxvd2VyX2ZpbGU8LWxpc3QuZmlsZXMoIi4vTmV3QW5hbHlzZXMvT3B0aW1fbm9ybWFsLyIsIHBhdHRlcm49ImFscGhhX2xvd2VyIikKCmxhbWJkYV9maWxlPC1saXN0LmZpbGVzKCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLCBwYXR0ZXJuPSJsYW1iZGFfZXN0aW1hdGVzIikKCgphbHBoYV9saXN0PC0gbGFwcGx5KGFscGhhX2ZpbGUsIGZ1bmN0aW9uKHgpIHJlYWQuY3N2KHBhc3RlKCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8iLHgsIHNlcD0iIiksIGhlYWRlciA9IFRSVUUpKQphbHBoYVVwcGVyX2xpc3Q8LSBsYXBwbHkoYWxwaGFVcHBlcl9maWxlLCBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZSgiLi9OZXdBbmFseXNlcy9PcHRpbV9ub3JtYWwvIix4LCBzZXA9IiIpLCBoZWFkZXIgPSBUUlVFKSkKYWxwaGFMb3dlcl9saXN0PC0gbGFwcGx5KGFscGhhTG93ZXJfZmlsZSwgZnVuY3Rpb24oeCkgcmVhZC5jc3YocGFzdGUoIi4vTmV3QW5hbHlzZXMvT3B0aW1fbm9ybWFsLyIseCwgc2VwPSIiKSwgaGVhZGVyID0gVFJVRSkpCmxhbWJkYV9saXN0PC0gbGFwcGx5KGxhbWJkYV9maWxlLCBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZSgiLi9OZXdBbmFseXNlcy9PcHRpbV9ub3JtYWwvIix4LCBzZXA9IiIpLCBoZWFkZXIgPSBUUlVFKSkKCiMgcGFzc2luZyBmcm9tIGxpc3QgdG8gZGF0YSBmcmFtZQojIEZpcnN0IHdlIG5lZWQgdG8gZG8gdGhlIGZpcnN0IGl0ZXJhdGlvbiAodG8gY3JlYXRlIGV2ZXJ5dGhpbmcpCmxhbWJkYV9pbnRyYV9maXhlZDwtZGF0YS5mcmFtZShSZWdpbWUxPXJlcChjKDEsMSwyLDIpLDEwKSwgUmVnaW1lMj1yZXAoYyg0LDUsNCw1KSwgMTApLCBSZXBsaWNhdGU9YyhyZXAoMSw4KSxyZXAoMiw4KSxyZXAoMyw4KSxyZXAoNCw4KSxyZXAoNSw4KSksIEVudj1yZXAoYyhyZXAoIk4iLDQpLCByZXAoIkNkIiw0KSksIDUpKQoKbGFtYmRhX2ludHJhX2ZpeGVkPC1sYW1iZGFfaW50cmFfZml4ZWRbLXdoaWNoKGxhbWJkYV9pbnRyYV9maXhlZCRSZWdpbWUxPT0yICYgbGFtYmRhX2ludHJhX2ZpeGVkJFJlcGxpY2F0ZT09MiksXSAjIHRvIHJlbW92ZSBTUjIgZnJvbSByZXBsaWNhdGUgMiBiZWNhdXNlIGl0IGRvZXMgbm90IGV4aXN0CgphbHBoYV9saXN0W1sxXV0KbGFtYmRhX2xpc3RbWzFdXQoKIyBwYXNzaW5nIGFscGhhcyB0byBkYXRhZnJhbWUKcmVwbGk8LXVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KGFscGhhX2ZpbGVbMV0sIHNwbGl0PSJfIilbMV0pWzZdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMV0KICBlbnY8LXVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KGFscGhhX2ZpbGVbMV0sIHNwbGl0PSJfIilbMV0pWzZdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKcmVnaW1lVHU8LWMoIjEiLCIxIiwgIjIiLCIyIikKcmVnaW1lVGU8LWMoIjQiLCI1IiwgIjQiLCI1IikKRW52PC1yZXAoZW52LCA0KQpSZXA8LXJlcChyZXBsaSw0KQoKYXV4X2FscGhhPC1hcy5kYXRhLmZyYW1lKGFscGhhX2xpc3RbWzFdXSkKCmF1eF9hbHBoYTI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdT1jKGF1eF9hbHBoYVsxLDJdLCBhdXhfYWxwaGFbMSwyXSwgYXV4X2FscGhhWzIsMl0sYXV4X2FscGhhWzIsMl0pLCBpbnRyYVRlPWMoYXV4X2FscGhhWzMsMl0sIGF1eF9hbHBoYVs0LDJdLCBhdXhfYWxwaGFbMywyXSxhdXhfYWxwaGFbNCwyXSksIGludGVyVHU9YyhhdXhfYWxwaGFbMSwzXSwgYXV4X2FscGhhWzEsNF0sIGF1eF9hbHBoYVsyLDNdLCBhdXhfYWxwaGFbMiw0XSksIGludGVyVGU9YyhhdXhfYWxwaGFbMywzXSwgYXV4X2FscGhhWzQsM10sIGF1eF9hbHBoYVszLDRdLCBhdXhfYWxwaGFbNCw0XSkpCgpmb3IoeCBpbiAyOmxlbmd0aChsYW1iZGFfbGlzdCkpewogIHJlcGxpPC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYV9maWxlW3hdLCBzcGxpdD0iXyIpWzFdKVs2XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYV9maWxlW3hdLCBzcGxpdD0iXyIpWzFdKVs2XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzJdCiAgCiAgaWYoeD09MyB8IHg9PTQpeyMgYmVjYXVzZSB0aGVyZSBpcyBubyBTUjIgaGVyZQogICAgcmVnaW1lVHU8LWMoIjEiLCIxIikKICAgIHJlZ2ltZVRlPC1jKCI0IiwiNSIpCiAgICBFbnY8LXJlcChlbnYsIDIpCiAgICBSZXA8LXJlcChyZXBsaSwyKQogICAgCiAgICBhdXhfYWxwaGE8LWFzLmRhdGEuZnJhbWUoYWxwaGFfbGlzdFtbeF1dKQogICAgCiAgICBhdXgyPC1kYXRhLmZyYW1lKHJlZ2ltZVR1LCByZWdpbWVUZSwgRW52LCBSZXAsIGludHJhVHU9YyhhdXhfYWxwaGFbMSwyXSwgYXV4X2FscGhhWzEsMl0pLCBpbnRyYVRlPWMoYXV4X2FscGhhWzIsMl0sIGF1eF9hbHBoYVszLDJdKSwgaW50ZXJUdT1jKGF1eF9hbHBoYVsxLDNdLCBhdXhfYWxwaGFbMSw0XSksIGludGVyVGU9YyhhdXhfYWxwaGFbMiwzXSwgYXV4X2FscGhhWzMsM10pKQogICAgCiAgICAKICB9ZWxzZXsKICAgIHJlZ2ltZVR1PC1jKCIxIiwiMSIsICIyIiwiMiIpCiAgICByZWdpbWVUZTwtYygiNCIsIjUiLCAiNCIsIjUiKQogICAgRW52PC1yZXAoZW52LCA0KQogICAgUmVwPC1yZXAocmVwbGksNCkKICAgIAogICAgYXV4X2FscGhhPC1hcy5kYXRhLmZyYW1lKGFscGhhX2xpc3RbW3hdXSkKICAgIAogICAgYXV4MjwtZGF0YS5mcmFtZShyZWdpbWVUdSwgcmVnaW1lVGUsIEVudiwgUmVwLCBpbnRyYVR1PWMoYXV4X2FscGhhWzEsMl0sIGF1eF9hbHBoYVsxLDJdLCBhdXhfYWxwaGFbMiwyXSxhdXhfYWxwaGFbMiwyXSksIGludHJhVGU9YyhhdXhfYWxwaGFbMywyXSwgYXV4X2FscGhhWzQsMl0sIGF1eF9hbHBoYVszLDJdLGF1eF9hbHBoYVs0LDJdKSwgaW50ZXJUdT1jKGF1eF9hbHBoYVsxLDNdLCBhdXhfYWxwaGFbMSw0XSwgYXV4X2FscGhhWzIsM10sIGF1eF9hbHBoYVsyLDRdKSwgaW50ZXJUZT1jKGF1eF9hbHBoYVszLDNdLCBhdXhfYWxwaGFbNCwzXSwgYXV4X2FscGhhWzMsNF0sIGF1eF9hbHBoYVs0LDRdKSkKICB9CiAgCiAgYXV4X2FscGhhMjwtcmJpbmQoYXV4X2FscGhhMiwgYXV4MikKfQoKIyMjIEFscGhhIExvd2VyCgojIHBhc3NpbmcgYWxwaGFzIHRvIGRhdGFmcmFtZQpyZXBsaTwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQoYWxwaGFMb3dlcl9maWxlWzFdLCBzcGxpdD0iXyIpWzFdKVs0XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYUxvd2VyX2ZpbGVbMV0sIHNwbGl0PSJfIilbMV0pWzRdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKcmVnaW1lVHU8LWMoIjEiLCIxIiwgIjIiLCIyIikKcmVnaW1lVGU8LWMoIjQiLCI1IiwgIjQiLCI1IikKRW52PC1yZXAoZW52LCA0KQpSZXA8LXJlcChyZXBsaSw0KQoKYXV4X2FscGhhTG93ZXI8LWFzLmRhdGEuZnJhbWUoYWxwaGFMb3dlcl9saXN0W1sxXV0pCgphdXhfYWxwaGFMb3dlcjI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwyXSwgYXV4X2FscGhhTG93ZXJbMSwyXSwgYXV4X2FscGhhTG93ZXJbMiwyXSxhdXhfYWxwaGFMb3dlclsyLDJdKSwgaW50cmFUZV9MPWMoYXV4X2FscGhhTG93ZXJbMywyXSwgYXV4X2FscGhhTG93ZXJbNCwyXSwgYXV4X2FscGhhTG93ZXJbMywyXSxhdXhfYWxwaGFMb3dlcls0LDJdKSwgaW50ZXJUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwzXSwgYXV4X2FscGhhTG93ZXJbMSw0XSwgYXV4X2FscGhhTG93ZXJbMiwzXSwgYXV4X2FscGhhTG93ZXJbMiw0XSksIGludGVyVGVfTD1jKGF1eF9hbHBoYUxvd2VyWzMsM10sIGF1eF9hbHBoYUxvd2VyWzQsM10sIGF1eF9hbHBoYUxvd2VyWzMsNF0sIGF1eF9hbHBoYUxvd2VyWzQsNF0pKQoKZm9yKHggaW4gMjpsZW5ndGgobGFtYmRhX2xpc3QpKXsKICByZXBsaTwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQoYWxwaGFMb3dlcl9maWxlW3hdLCBzcGxpdD0iXyIpWzFdKVs0XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYUxvd2VyX2ZpbGVbeF0sIHNwbGl0PSJfIilbMV0pWzRdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKICBpZih4PT0zIHwgeD09NCl7IyBiZWNhdXNlIHRoZXJlIGlzIG5vIFNSMiBoZXJlCiAgICByZWdpbWVUdTwtYygiMSIsIjEiKQogICAgcmVnaW1lVGU8LWMoIjQiLCI1IikKICAgIEVudjwtcmVwKGVudiwgMikKICAgIFJlcDwtcmVwKHJlcGxpLDIpCiAgICAKICAgIGF1eF9hbHBoYUxvd2VyPC1hcy5kYXRhLmZyYW1lKGFscGhhTG93ZXJfbGlzdFtbeF1dKQogICAgCiAgICBhdXgyPC1kYXRhLmZyYW1lKHJlZ2ltZVR1LCByZWdpbWVUZSwgRW52LCBSZXAsIGludHJhVHVfTD1jKGF1eF9hbHBoYUxvd2VyWzEsMl0sIGF1eF9hbHBoYUxvd2VyWzEsMl0pLCBpbnRyYVRlX0w9YyhhdXhfYWxwaGFMb3dlclsyLDJdLCBhdXhfYWxwaGFMb3dlclszLDJdKSwgaW50ZXJUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwzXSwgYXV4X2FscGhhTG93ZXJbMSw0XSksIGludGVyVGVfTD1jKGF1eF9hbHBoYUxvd2VyWzIsM10sIGF1eF9hbHBoYUxvd2VyWzMsM10pKQogICAgCiAgICAKICB9ZWxzZXsKICAgIHJlZ2ltZVR1PC1jKCIxIiwiMSIsICIyIiwiMiIpCiAgICByZWdpbWVUZTwtYygiNCIsIjUiLCAiNCIsIjUiKQogICAgRW52PC1yZXAoZW52LCA0KQogICAgUmVwPC1yZXAocmVwbGksNCkKICAgIAogICAgYXV4X2FscGhhTG93ZXI8LWFzLmRhdGEuZnJhbWUoYWxwaGFMb3dlcl9saXN0W1t4XV0pCiAgICAKICAgIGF1eDI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwyXSwgYXV4X2FscGhhTG93ZXJbMSwyXSwgYXV4X2FscGhhTG93ZXJbMiwyXSxhdXhfYWxwaGFMb3dlclsyLDJdKSwgaW50cmFUZV9MPWMoYXV4X2FscGhhTG93ZXJbMywyXSwgYXV4X2FscGhhTG93ZXJbNCwyXSwgYXV4X2FscGhhTG93ZXJbMywyXSxhdXhfYWxwaGFMb3dlcls0LDJdKSwgaW50ZXJUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwzXSwgYXV4X2FscGhhTG93ZXJbMSw0XSwgYXV4X2FscGhhTG93ZXJbMiwzXSwgYXV4X2FscGhhTG93ZXJbMiw0XSksIGludGVyVGVfTD1jKGF1eF9hbHBoYUxvd2VyWzMsM10sIGF1eF9hbHBoYUxvd2VyWzQsM10sIGF1eF9hbHBoYUxvd2VyWzMsNF0sIGF1eF9hbHBoYUxvd2VyWzQsNF0pKQogIH0KICAKICBhdXhfYWxwaGFMb3dlcjI8LXJiaW5kKGF1eF9hbHBoYUxvd2VyMiwgYXV4MikKfQoKIyMjIEFscGhhIFVwcGVyCgojIHBhc3NpbmcgYWxwaGFzIHRvIGRhdGFmcmFtZQpyZXBsaTwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQoYWxwaGFVcHBlcl9maWxlWzFdLCBzcGxpdD0iXyIpWzFdKVs0XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYVVwcGVyX2ZpbGVbMV0sIHNwbGl0PSJfIilbMV0pWzRdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKcmVnaW1lVHU8LWMoIjEiLCIxIiwgIjIiLCIyIikKcmVnaW1lVGU8LWMoIjQiLCI1IiwgIjQiLCI1IikKRW52PC1yZXAoZW52LCA0KQpSZXA8LXJlcChyZXBsaSw0KQoKYXV4X2FscGhhVXBwZXI8LWFzLmRhdGEuZnJhbWUoYWxwaGFVcHBlcl9saXN0W1sxXV0pCgphdXhfYWxwaGFVcHBlcjI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwyXSwgYXV4X2FscGhhVXBwZXJbMSwyXSwgYXV4X2FscGhhVXBwZXJbMiwyXSxhdXhfYWxwaGFVcHBlclsyLDJdKSwgaW50cmFUZV9VPWMoYXV4X2FscGhhVXBwZXJbMywyXSwgYXV4X2FscGhhVXBwZXJbNCwyXSwgYXV4X2FscGhhVXBwZXJbMywyXSxhdXhfYWxwaGFVcHBlcls0LDJdKSwgaW50ZXJUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwzXSwgYXV4X2FscGhhVXBwZXJbMSw0XSwgYXV4X2FscGhhVXBwZXJbMiwzXSwgYXV4X2FscGhhVXBwZXJbMiw0XSksIGludGVyVGVfVT1jKGF1eF9hbHBoYVVwcGVyWzMsM10sIGF1eF9hbHBoYVVwcGVyWzQsM10sIGF1eF9hbHBoYVVwcGVyWzMsNF0sIGF1eF9hbHBoYVVwcGVyWzQsNF0pKQoKZm9yKHggaW4gMjpsZW5ndGgobGFtYmRhX2xpc3QpKXsKICByZXBsaTwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQoYWxwaGFVcHBlcl9maWxlW3hdLCBzcGxpdD0iXyIpWzFdKVs0XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYVVwcGVyX2ZpbGVbeF0sIHNwbGl0PSJfIilbMV0pWzRdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKICBpZih4PT0zIHwgeD09NCl7IyBiZWNhdXNlIHRoZXJlIGlzIG5vIFNSMiBoZXJlCiAgICByZWdpbWVUdTwtYygiMSIsIjEiKQogICAgcmVnaW1lVGU8LWMoIjQiLCI1IikKICAgIEVudjwtcmVwKGVudiwgMikKICAgIFJlcDwtcmVwKHJlcGxpLDIpCiAgICAKICAgIGF1eF9hbHBoYVVwcGVyPC1hcy5kYXRhLmZyYW1lKGFscGhhVXBwZXJfbGlzdFtbeF1dKQogICAgCiAgICBhdXgyPC1kYXRhLmZyYW1lKHJlZ2ltZVR1LCByZWdpbWVUZSwgRW52LCBSZXAsIGludHJhVHVfVT1jKGF1eF9hbHBoYVVwcGVyWzEsMl0sIGF1eF9hbHBoYVVwcGVyWzEsMl0pLCBpbnRyYVRlX1U9YyhhdXhfYWxwaGFVcHBlclsyLDJdLCBhdXhfYWxwaGFVcHBlclszLDJdKSwgaW50ZXJUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwzXSwgYXV4X2FscGhhVXBwZXJbMSw0XSksIGludGVyVGVfVT1jKGF1eF9hbHBoYVVwcGVyWzIsM10sIGF1eF9hbHBoYVVwcGVyWzMsM10pKQogICAgCiAgICAKICB9ZWxzZXsKICAgIHJlZ2ltZVR1PC1jKCIxIiwiMSIsICIyIiwiMiIpCiAgICByZWdpbWVUZTwtYygiNCIsIjUiLCAiNCIsIjUiKQogICAgRW52PC1yZXAoZW52LCA0KQogICAgUmVwPC1yZXAocmVwbGksNCkKICAgIAogICAgYXV4X2FscGhhVXBwZXI8LWFzLmRhdGEuZnJhbWUoYWxwaGFVcHBlcl9saXN0W1t4XV0pCiAgICAKICAgIGF1eDI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwyXSwgYXV4X2FscGhhVXBwZXJbMSwyXSwgYXV4X2FscGhhVXBwZXJbMiwyXSxhdXhfYWxwaGFVcHBlclsyLDJdKSwgaW50cmFUZV9VPWMoYXV4X2FscGhhVXBwZXJbMywyXSwgYXV4X2FscGhhVXBwZXJbNCwyXSwgYXV4X2FscGhhVXBwZXJbMywyXSxhdXhfYWxwaGFVcHBlcls0LDJdKSwgaW50ZXJUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwzXSwgYXV4X2FscGhhVXBwZXJbMSw0XSwgYXV4X2FscGhhVXBwZXJbMiwzXSwgYXV4X2FscGhhVXBwZXJbMiw0XSksIGludGVyVGVfVT1jKGF1eF9hbHBoYVVwcGVyWzMsM10sIGF1eF9hbHBoYVVwcGVyWzQsM10sIGF1eF9hbHBoYVVwcGVyWzMsNF0sIGF1eF9hbHBoYVVwcGVyWzQsNF0pKQogIH0KICAKICBhdXhfYWxwaGFVcHBlcjI8LXJiaW5kKGF1eF9hbHBoYVVwcGVyMiwgYXV4MikKfQoKIyBQYXNzaW5nIGxhbWJkYSB0byBkYXRhIGZyYW1lCnJlcGxpPC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYV9maWxlWzFdLCBzcGxpdD0iXyIpWzFdKVs2XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYV9maWxlWzFdLCBzcGxpdD0iXyIpWzFdKVs2XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzJdCiAgCkZvY2FsPC1jKCIxIiwiMSIsIjIiLCIyIiwiNCIsIjQiLCI1IiwiNSIpCkNvbXA8LWMoIjQiLCI1IiwiNCIsIjUiLCIxIiwiMiIsIjEiLCIyIikKRW52PC1yZXAoZW52LCA4KQpSZXA8LXJlcChyZXBsaSw4KQogICAgCmF1eF9sYW1iZGE8LWNiaW5kKGFzLmRhdGEuZnJhbWUobGFtYmRhX2xpc3RbWzFdXSlbLGMoMyw0LDUpXSxGb2NhbCxDb21wLCBFbnYsIFJlcCkKCmZvcih4IGluIDI6bGVuZ3RoKGxhbWJkYV9saXN0KSl7CiAgcmVwbGk8LXVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KGFscGhhX2ZpbGVbeF0sIHNwbGl0PSJfIilbMV0pWzZdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMV0KICBlbnY8LXVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KGFscGhhX2ZpbGVbeF0sIHNwbGl0PSJfIilbMV0pWzZdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKICBpZih4PT0zIHwgeD09NCl7IyBiZWNhdXNlIHRoZXJlIGlzIG5vIFNSMiBoZXJlCiAgICBGb2NhbDwtYygiMSIsIjEiLCI0IiwiNSIpCiAgICBDb21wPC1jKCI0IiwiNSIsIjEiLCIxIikKICAgIEVudjwtcmVwKGVudiwgNCkKICAgIFJlcDwtcmVwKHJlcGxpLDQpCiAgICAKICAgIGF1eDwtY2JpbmQoYXMuZGF0YS5mcmFtZShsYW1iZGFfbGlzdFtbeF1dKVssYygzLDQsNSldLEZvY2FsLENvbXAsIEVudiwgUmVwKQogICAgCiAgfWVsc2V7CiAgICBGb2NhbDwtYygiMSIsIjEiLCIyIiwiMiIsIjQiLCI0IiwiNSIsIjUiKQogICAgQ29tcDwtYygiNCIsIjUiLCI0IiwiNSIsIjEiLCIyIiwiMSIsIjIiKQogICAgRW52PC1yZXAoZW52LCA4KQogICAgUmVwPC1yZXAocmVwbGksOCkKICAgIAogICAgYXV4PC1jYmluZChhcy5kYXRhLmZyYW1lKGxhbWJkYV9saXN0W1t4XV0pWyxjKDMsNCw1KV0sRm9jYWwsQ29tcCwgRW52LCBSZXApCiAgfQogIAogIGF1eF9sYW1iZGE8LXJiaW5kKGF1eF9sYW1iZGEsIGF1eCkKfQoKCiNNYXRjaGluZyBhbGwgdGhlIGRhdGEKCmFscGhhc19tYXRfRDwtYXMuZGF0YS5mcmFtZShjYmluZChhdXhfYWxwaGEyLCBhdXhfYWxwaGFMb3dlcjIsIGF1eF9hbHBoYVVwcGVyMikpCgpzdHIobGFtYmRhX2ludHJhX2ZpeGVkKQoKIyMjIyBhZGRpbmcgbGFtYmRhCgphbHBoYXNfbWF0X0QkbGFtYmRhVHU8LXNhcHBseShjKDE6bGVuZ3RoKGFscGhhc19tYXRfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgYXV4aTwtc3Vic2V0KGF1eF9sYW1iZGEsIChGb2NhbD09YWxwaGFzX21hdF9EJHJlZ2ltZVR1W3hdICYgQ29tcD09YWxwaGFzX21hdF9EJHJlZ2ltZVRlW3hdKSAmIFJlcD09YWxwaGFzX21hdF9EJFJlcFt4XSAmIEVudj09YWxwaGFzX21hdF9EJEVudlt4XSApCiAgCiAgYXV4aVsxLDFdCn0pCgphbHBoYXNfbWF0X0QkbGFtYmRhVGU8LXNhcHBseShjKDE6bGVuZ3RoKGFscGhhc19tYXRfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgYXV4aTwtc3Vic2V0KGF1eF9sYW1iZGEsIChGb2NhbD09YWxwaGFzX21hdF9EJHJlZ2ltZVRlW3hdICYgQ29tcD09YWxwaGFzX21hdF9EJHJlZ2ltZVR1W3hdKSAmIFJlcD09YWxwaGFzX21hdF9EJFJlcFt4XSAmIEVudj09YWxwaGFzX21hdF9EJEVudlt4XSApCiAgCiAgYXV4aVsxLDFdCn0pCgoKYWxwaGFzX21hdF9EJGxhbWJkYVR1X0w8LXNhcHBseShjKDE6bGVuZ3RoKGFscGhhc19tYXRfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgYXV4aTwtc3Vic2V0KGF1eF9sYW1iZGEsIChGb2NhbD09YWxwaGFzX21hdF9EJHJlZ2ltZVR1W3hdICYgQ29tcD09YWxwaGFzX21hdF9EJHJlZ2ltZVRlW3hdKSAmIFJlcD09YWxwaGFzX21hdF9EJFJlcFt4XSAmIEVudj09YWxwaGFzX21hdF9EJEVudlt4XSApCiAgCiAgYXV4aVsxLDJdCn0pCgphbHBoYXNfbWF0X0QkbGFtYmRhVGVfTDwtc2FwcGx5KGMoMTpsZW5ndGgoYWxwaGFzX21hdF9EWywxXSkpLCBmdW5jdGlvbih4KXsKICBhdXhpPC1zdWJzZXQoYXV4X2xhbWJkYSwgKEZvY2FsPT1hbHBoYXNfbWF0X0QkcmVnaW1lVGVbeF0gJiBDb21wPT1hbHBoYXNfbWF0X0QkcmVnaW1lVHVbeF0pICYgUmVwPT1hbHBoYXNfbWF0X0QkUmVwW3hdICYgRW52PT1hbHBoYXNfbWF0X0QkRW52W3hdICkKICAKICBhdXhpWzEsMl0KfSkKCmFscGhhc19tYXRfRCRsYW1iZGFUdV9VPC1zYXBwbHkoYygxOmxlbmd0aChhbHBoYXNfbWF0X0RbLDFdKSksIGZ1bmN0aW9uKHgpewogIGF1eGk8LXN1YnNldChhdXhfbGFtYmRhLCAoRm9jYWw9PWFscGhhc19tYXRfRCRyZWdpbWVUdVt4XSAmIENvbXA9PWFscGhhc19tYXRfRCRyZWdpbWVUZVt4XSkgJiBSZXA9PWFscGhhc19tYXRfRCRSZXBbeF0gJiBFbnY9PWFscGhhc19tYXRfRCRFbnZbeF0gKQogIAogIGF1eGlbMSwzXQp9KQoKYWxwaGFzX21hdF9EJGxhbWJkYVRlX1U8LXNhcHBseShjKDE6bGVuZ3RoKGFscGhhc19tYXRfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgYXV4aTwtc3Vic2V0KGF1eF9sYW1iZGEsIChGb2NhbD09YWxwaGFzX21hdF9EJHJlZ2ltZVRlW3hdICYgQ29tcD09YWxwaGFzX21hdF9EJHJlZ2ltZVR1W3hdKSAmIFJlcD09YWxwaGFzX21hdF9EJFJlcFt4XSAmIEVudj09YWxwaGFzX21hdF9EJEVudlt4XSApCiAgCiAgYXV4aVsxLDNdCn0pCgphbHBoYXNfbWF0X0QkRW52MjwtbWFwdmFsdWVzKGFscGhhc19tYXRfRCRFbnYsIGMoIkMiLCJOIiksIGMoIkNkIiwiTiIpKQoKIyBjbGVhbiB1cCB0aGUgbWF0cml4LCBiZWNhdXNlIGl0IGhhcyBhIGxvdCBvZiByZXBlYXRlZCBjb2x1bW5zCmFscGhhc19tYXRfRDwtYWxwaGFzX21hdF9EWyxjKDE6OCwgMTM6MTYsMjE6MzApXQoKYWxwaGFzX21hdF9ECgpgYGAKCiMjIyMgUGxvdHRpbmcgZGF0YQoKYGBge3J9CiMjIyBQbG90dGluZyBkYXRhCgpjb2xuYW1lcyhhbHBoYXNfbWF0X0QpPC1jKCJUdV9SZWdpbWUiLCAiVGVfUmVnaW1lIiwgIkVudmlyb25tZW50IiwgIlJlcGxpY2F0ZSIsICJUdV9pbnRyYSIsICJUZV9pbnRyYSIsICJUdV9pbnRlciIsICJUZV9pbnRlciIsICJUdV9pbnRyYV9MIiwgIlRlX2ludHJhX0wiLCAiVHVfaW50ZXJfTCIsICJUZV9pbnRlcl9MIiwgIlR1X2ludHJhX1UiLCAiVGVfaW50cmFfVSIsICJUdV9pbnRlcl9VIiwgIlRlX2ludGVyX1UiLCAiVHVfbGFtYmRhIiwgIlRlX2xhbWJkYSIsIlR1X2xhbWJkYV9MIiwgIlRlX2xhbWJkYV9MIiwiVHVfbGFtYmRhX1UiLCAiVGVfbGFtYmRhX1UiKQoKCmFscGhhc19tYXRfRF9sb25nPC1nYXRoZXIoYWxwaGFzX21hdF9ELCBwYXJhbWV0ZXIsIHZhbHVlLFR1X2ludHJhOlRlX2xhbWJkYV9VICkKCmFscGhhc19tYXRfRF9sb25nJGNhdGVnb3J5PC1tYXB2YWx1ZXMoYWxwaGFzX21hdF9EX2xvbmckcGFyYW1ldGVyLCBjKCJUdV9pbnRyYSIsICJUZV9pbnRyYSIsICJUdV9pbnRlciIsICJUZV9pbnRlciIsICJUdV9pbnRyYV9MIiwgIlRlX2ludHJhX0wiLCAiVHVfaW50ZXJfTCIsICJUZV9pbnRlcl9MIiwgIlR1X2ludHJhX1UiLCAiVGVfaW50cmFfVSIsICJUdV9pbnRlcl9VIiwgIlRlX2ludGVyX1UiLCAiVHVfbGFtYmRhIiwgIlRlX2xhbWJkYSIsIlR1X2xhbWJkYV9MIiwgIlRlX2xhbWJkYV9MIiwiVHVfbGFtYmRhX1UiLCAiVGVfbGFtYmRhX1UiKSwgYygiaW50cmEiLCAiaW50cmEiLCAiaW50ZXIiLCAiaW50ZXIiLCAiaW50cmFfTCIsICJpbnRyYV9MIiwgImludGVyX0wiLCAiaW50ZXJfTCIsImludHJhX1UiLCAiaW50cmFfVSIsICJpbnRlcl9VIiwgImludGVyX1UiLCJsYW1iZGEiLCJsYW1iZGEiLCJsYW1iZGFfTCIsImxhbWJkYV9MIiwibGFtYmRhX1UiLCJsYW1iZGFfVSIpKQoKc3RyKGFscGhhc19tYXRfRF9sb25nKQoKIyMjIyMjIyMjIyMKCgpnZ3Bsb3Qoc3Vic2V0KGFscGhhc19tYXRfRF9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRyYSIgJiBUdV9SZWdpbWU9PSIxIiAmIEVudmlyb25tZW50PT0iQyIpLCBhZXMoeD1UZV9SZWdpbWUsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSwgYWVzKHNoYXBlPVJlcGxpY2F0ZSkpKwogIHRoZW1lX2luZXMrCiAgI3NjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQoKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8yNk1heV9SS19pbnRyYVRlX3cwX3JlcF9DRC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0RfbG9uZywgcGFyYW1ldGVyPT0iVGVfaW50cmEiICYgVHVfUmVnaW1lPT0iMSIgJiBFbnZpcm9ubWVudD09Ik4iKSwgYWVzKHg9VGVfUmVnaW1lLCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8yNk1heV9SS19pbnRyYVRlX3cwX3JlcF9OLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KGFscGhhc19tYXRfRF9sb25nLCBwYXJhbWV0ZXI9PSJUdV9pbnRyYSIgJiBUZV9SZWdpbWU9PSI0IiAmIEVudmlyb25tZW50PT0iQyIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9VHVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8yNk1heV9SS19pbnRyYVR1X3cwX3JlcF9DRC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0RfbG9uZywgcGFyYW1ldGVyPT0iVHVfaW50cmEiICYgVGVfUmVnaW1lPT0iNCIgJiBFbnZpcm9ubWVudD09Ik4iKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PVR1X1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBhZXMoc2hhcGU9UmVwbGljYXRlKSkrCiAgdGhlbWVfaW5lcysKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSxsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIHVydGljYWUpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvT3B0aW1fbm9ybWFsLzI2TWF5X1JLX2ludHJhVHVfdzBfcmVwX04ucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCiMjIyMjIyMjIElOVEVSCgpnZ3Bsb3Qoc3Vic2V0KGFscGhhc19tYXRfRF9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRlciIgJiBFbnZpcm9ubWVudD09IkMiKSwgYWVzKHg9VGVfUmVnaW1lLCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGZhY2V0X2dyaWQoLn5UdV9SZWdpbWUsIGxhYmVsbGVyPWxhYmVsbGVyKFR1X1JlZ2ltZT1yZWdpbWVUdSwgVGVfUmVnaW1lPXJlZ2ltZVRlKSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyPSJkYXJrZ3JheSIpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludGVyc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIGV2YW5zaSkiKSsKICB4bGFiKCJTZWxlY3Rpb24gcmVnaW1lIFQuIGV2YW5zaSIpKwogIGdndGl0bGUoIkVudmlyb25tZW50OiBjYWRtaXVtIikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8yNk1heV9SS19pbnRlclRlX3cwX3JlcF9DZC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0RfbG9uZywgcGFyYW1ldGVyPT0iVGVfaW50ZXIiICYgRW52aXJvbm1lbnQ9PSJOIiksIGFlcyh4PVRlX1JlZ2ltZSwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBmYWNldF9ncmlkKC5+VHVfUmVnaW1lLCBsYWJlbGxlcj1sYWJlbGxlcihUdV9SZWdpbWU9cmVnaW1lVHUsIFRlX1JlZ2ltZT1yZWdpbWVUZSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91cj0iZGFya2dyYXkiKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBhZXMoc2hhcGU9UmVwbGljYXRlKSkrCiAgdGhlbWVfaW5lcysKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRlcnNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiU2VsZWN0aW9uIHJlZ2ltZSBULiBldmFuc2kiKSsKICBnZ3RpdGxlKCJFbnZpcm9ubWVudDogY29udHJvbCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9PcHRpbV9ub3JtYWwvMjZNYXlfUktfaW50ZXJUZV93MF9yZXBfTi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0RfbG9uZywgcGFyYW1ldGVyPT0iVHVfaW50ZXIiICYgRW52aXJvbm1lbnQ9PSJDIiksIGFlcyhmaWxsPVR1X1JlZ2ltZSwgeT12YWx1ZSwgeD1UdV9SZWdpbWUpKSsKICBmYWNldF9ncmlkKC5+VGVfUmVnaW1lLCBsYWJlbGxlcj1sYWJlbGxlcihUdV9SZWdpbWU9cmVnaW1lVHUsIFRlX1JlZ2ltZT1yZWdpbWVUZSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91cj0iZGFya2dyYXkiKSsKICBnZW9tX2JveHBsb3Qob3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjc1KSwgYWVzKHNoYXBlPVJlcGxpY2F0ZSkpKwogIHRoZW1lX2luZXMrCiBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50ZXJzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gdXJ0aWNhZSkiKSsKICB4bGFiKCJTZWxlY3Rpb24gcmVnaW1lIFQuIHVydGljYWUiKSsKICBnZ3RpdGxlKCJFbnZpcm9ubWVudDogY2FkbWl1bSIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9PcHRpbV9ub3JtYWwvMjZNYXlfUktfaW50ZXJUdV93MF9yZXBfQ2QucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQoYWxwaGFzX21hdF9EX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludGVyIiAmIEVudmlyb25tZW50PT0iTiIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9VHVfUmVnaW1lKSkrCiAgZmFjZXRfZ3JpZCguflRlX1JlZ2ltZSwgbGFiZWxsZXI9bGFiZWxsZXIoVHVfUmVnaW1lPXJlZ2ltZVR1LCBUZV9SZWdpbWU9cmVnaW1lVGUpKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXI9ImRhcmtncmF5IikrCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC43NSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRlcnNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUgVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIkVudmlyb25tZW50OiBjb250cm9sIikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8yNk1heV9SS19pbnRlclR1X3cwX3JlcF9OLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgojIyMjIyMjIyMgTGFtYmRhCgpnZ3Bsb3Qoc3Vic2V0KGFscGhhc19tYXRfRF9sb25nLCBwYXJhbWV0ZXI9PSJUZV9sYW1iZGEiICYgVHVfUmVnaW1lPT0iMSIgJiBFbnZpcm9ubWVudD09IkMiKSwgYWVzKHg9VGVfUmVnaW1lLCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJpbnNpYyBncm93dGggcmF0ZSAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUgVC4gZXZhbnNpIikrCiAgZ2d0aXRsZSgiRW52aXJvbm1lbnQ6IGNhZG1pdW0iKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvT3B0aW1fbm9ybWFsLzI2TWF5X1JLX2xhbWJkYVRlX3cwX3JlcF9DRC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0RfbG9uZywgcGFyYW1ldGVyPT0iVGVfbGFtYmRhIiAmIFR1X1JlZ2ltZT09IjEiICYgRW52aXJvbm1lbnQ9PSJOIiksIGFlcyh4PVRlX1JlZ2ltZSwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBhZXMoc2hhcGU9UmVwbGljYXRlKSkrCiAgdGhlbWVfaW5lcysKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJpbnNpYyBncm93dGggcmF0ZSAoVC4gZXZhbnNpKSIpKwogICAgeGxhYigiU2VsZWN0aW9uIHJlZ2ltZSBULiBldmFuc2kiKSsKICBnZ3RpdGxlKCJFbnZpcm9ubWVudDogY29udHJvbCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9PcHRpbV9ub3JtYWwvMjZNYXlfUktfbGFtYmRhVGVfdzBfcmVwX04ucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQoYWxwaGFzX21hdF9EX2xvbmcsIHBhcmFtZXRlcj09IlR1X2xhbWJkYSIgJiBUZV9SZWdpbWU9PSI0IiAmIEVudmlyb25tZW50PT0iQyIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9VHVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmluc2ljIGdyb3d0aCByYXRlIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUgVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIkVudmlyb25tZW50OiBjYWRtaXVtIikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8yNk1heV9SS19sYW1iZGFUdV93MF9yZXBfQ0QucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQoYWxwaGFzX21hdF9EX2xvbmcsIHBhcmFtZXRlcj09IlR1X2xhbWJkYSIgJiBUZV9SZWdpbWU9PSI0IiAmIEVudmlyb25tZW50PT0iTiIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9VHVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmluc2ljIGdyb3d0aCByYXRlIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUgVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIkVudmlyb25tZW50OiBjb250cm9sIikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC8yNk1heV9SS19sYW1iZGFUdV93MF9yZXBfTi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKCmBgYAoKIyMjIyMgUHJlZGljdGluZyBkYXRhCgpgYGB7cn0Kc3RyKGFscGhhc19tYXRfRCkKCmFscGhhc19tYXRfRCRFbnYyPC1tYXB2YWx1ZXMoYWxwaGFzX21hdF9EJEVudmlyb25tZW50LCBjKCJDIiwgIk4iKSwgYygiQ2QiLCJOIikpCnN0cihjYSkKCiMgU2luY2UgdGhlIGxhbWJkYSBpcyBmcm9tIHRoZSBsb2cgZGF0YQpjYSRwcmVkX0Q8LXNhcHBseShjKDE6bGVuZ3RoKGNhJEJsb2NrKSksIGZ1bmN0aW9uKHgpewogIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVHUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUlt4XSkgJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVHVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFR1X1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFRlX1JlZ2ltZT09Y2EkQ29tcFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2xhbWJkYVsxXQogICAgCiAgfWVsc2UgaWYoY2EkRm9jYWxmZW1hbGVbeF09PSJUZSIpewogICAgYWxwaGFfaTwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUZV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFR1X1JlZ2ltZT09Y2EkQ29tcFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2xhbWJkYVsxXQogIH0KICAKICBpZihjYSRUeXBlW3hdPT0iSU5UUkEiKXsKICAgIGRlbnNGPC1jYSREZW5zW3hdCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKihkZW5zRikpCiAgICAKICB9ZWxzZSBpZihjYSRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGRlbnNDPC1jYSREZW5zW3hdCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipkZW5zQykKICB9CiAgICAKICBwcmVkCiAgCn0pCng8LTEKY2EkcHJlZF9EX0w8LXNhcHBseShjKDE6bGVuZ3RoKGNhJEJsb2NrKSksIGZ1bmN0aW9uKHgpewogIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVHUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludHJhX0xbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFR1X1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFRlX1JlZ2ltZT09Y2EkQ29tcFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludGVyX0xbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUdV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVHVfbGFtYmRhX0xbMV0KICAgIAogIH1lbHNlIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVGUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2ludHJhX0xbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFR1X1JlZ2ltZT09Y2EkQ29tcFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2ludGVyX0xbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUZV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfbGFtYmRhX0xbMV0KICB9CiAgCiAgaWYoY2EkVHlwZVt4XT09IklOVFJBIil7CiAgICBkZW5zRjwtY2EkRGVuc1t4XQogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaSooZGVuc0YtMSkpCiAgICAKICB9ZWxzZSBpZihjYSRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGRlbnNDPC1jYSREZW5zW3hdLTEKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKmRlbnNDKQogIH0KICAgIAogIHByZWQKICAKfSkKCmNhJHByZWRfRF9VPC1zYXBwbHkoYygxOmxlbmd0aChjYSRCbG9jaykpLCBmdW5jdGlvbih4KXsKIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVHUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludHJhX1VbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFR1X1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFRlX1JlZ2ltZT09Y2EkQ29tcFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludGVyX1VbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUdV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVHVfbGFtYmRhX1VbMV0KICAgIAogIH1lbHNlIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVGUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2ludHJhX1VbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFR1X1JlZ2ltZT09Y2EkQ29tcFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2ludGVyX1VbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUZV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfbGFtYmRhX1VbMV0KICB9CiAgCiAgaWYoY2EkVHlwZVt4XT09IklOVFJBIil7CiAgICBkZW5zRjwtY2EkRGVuc1t4XQogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaSooZGVuc0YtMSkpCiAgICAKICB9ZWxzZSBpZihjYSRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGRlbnNDPC1jYSREZW5zW3hdLTEKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKmRlbnNDKQogIH0KICAgIAogIHByZWQKICAKfSkKCmBgYAoKIyMjIyMgUHJlZGljdGluZyBlYWNoIGRlbnNpdHkKCmBgYHtyfQpkZW5zaXR5X2F1eDwtc2VxKDAsIDEwLCBieT0oMTAvMTAwKSkKCnByZWRfZGZfRDwtYXMuZGF0YS5mcmFtZShleHBhbmRfZ3JpZChEZW5zaXR5PWRlbnNpdHlfYXV4LCBUdV9SZWdpbWU9YygxLDIpLCBUZV9SZWdpbWU9Yyg0LDUpLCBSZXBsaWNhdGU9YygxOjUpLCBFbnZpcm9ubWVudD1jKCJOIiwgIkMiKSkpCgpwcmVkX2RmX0QkVHVfbWVhbl9pbnRyYTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9EWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRCRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9EJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9EJFJlcGxpY2F0ZVt4XSkkVHVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUdV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUdV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaSpwcmVkX2RmX0QkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9EJFR1X21lYW5faW50ZXI8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRCRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRCRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9EJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9EJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9EJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRCRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9EJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9EJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKnByZWRfZGZfRCREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgoKcHJlZF9kZl9EJFR1X2ludHJhX0w8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRCRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFR1X2ludHJhX0xbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUdV9pbnRlcl9MWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRCRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFR1X2xhbWJkYV9MWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9EJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRCRUdV9pbnRlcl9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0RbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUdV9pbnRyYV9MWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRCRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9EJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9EJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9EJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJfTFsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUdV9sYW1iZGFfTFsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipwcmVkX2RmX0QkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9EJFR1X2ludHJhX1U8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRCRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFR1X2ludHJhX1VbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUdV9pbnRlcl9VWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRCRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFR1X2xhbWJkYV9VWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9EJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRCRUdV9pbnRlcl9VPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0RbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUdV9pbnRyYV9VWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRCRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9EJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9EJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9EJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJfVVsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUdV9sYW1iZGFfVVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipwcmVkX2RmX0QkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9EJFRlX21lYW5faW50cmE8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRCRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFRlX2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRCRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9EJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9EJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9EJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRCRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9EJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9EJFJlcGxpY2F0ZVt4XSkkVGVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9EJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRCRUZV9tZWFuX2ludGVyPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0RbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRCRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRCRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRCRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipwcmVkX2RmX0QkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9EJFRlX2ludHJhX0w8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRCRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFRlX2ludHJhX0xbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUZV9pbnRlcl9MWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRCRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYV9MWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9EJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRCRUZV9pbnRlcl9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0RbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUZV9pbnRyYV9MWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRCRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9EJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9EJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9EJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJfTFsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFfTFsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipwcmVkX2RmX0QkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKcHJlZF9kZl9EJFRlX2ludHJhX1U8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfRFssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRCRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFRlX2ludHJhX1VbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0QkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUZV9pbnRlcl9VWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudmlyb25tZW50PT1wcmVkX2RmX0QkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRCRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRCRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYV9VWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9EJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRCRUZV9pbnRlcl9VPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0RbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUZV9pbnRyYV9VWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRCRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9EJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9EJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9EJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJfVVsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnZpcm9ubWVudD09cHJlZF9kZl9EJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0QkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0QkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFfVVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipwcmVkX2RmX0QkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKIyBSZW1vdmluZyBUdSBldm9sdmVkIHJlcGxpY2F0ZSAyIGJlY2F1c2UgdGhlcmUgaXMgbm8gZGF0YQpwcmVkX2RmX0Q8LXByZWRfZGZfRFstd2hpY2gocHJlZF9kZl9EJFR1X1JlZ2ltZT09MiAmIHByZWRfZGZfRCRSZXBsaWNhdGU9PTIpLF0KCgoKIyBUcmFuc2Zvcm1pbmcgZXZlcnl0aGluZyBiZWxsb3cgMCBpbnRvIDAgZm9yIHRoZSBsb3dlciBpbnRlcnZhbAoKcHJlZF9kZl9EJFRlX2ludGVyX0xbd2hpY2gocHJlZF9kZl9EJFRlX2ludGVyX0w8MCldPC0wCnByZWRfZGZfRCRUZV9pbnRyYV9MW3doaWNoKHByZWRfZGZfRCRUZV9pbnRyYV9MPDApXTwtMApwcmVkX2RmX0QkVHVfaW50ZXJfTFt3aGljaChwcmVkX2RmX0QkVHVfaW50ZXJfTDwwKV08LTAKcHJlZF9kZl9EJFR1X2ludHJhX0xbd2hpY2gocHJlZF9kZl9EJFR1X2ludHJhX0w8MCldPC0wCgoKCmBgYAoKIyMjIyMgUGxvdHRpbmcgcHJlZGljdGlvbnMKCiMjIyMjIENPTlRST0wgSU5UUkEKCmBgYHtyfQpjYSRSZXBsaWNhdGU8LWFzLmNoYXJhY3RlcihjYSRSZXApCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0QsIFR1X1JlZ2ltZT09MSAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0QsIFR1X1JlZ2ltZT09MSAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLTEsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIlR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC9wcmVkX1R1X0lOVFJBX0NvbnRyb2xfd2F0ZXIucGRmIiwgd2lkdGg9MjUsIGhlaWdodD0xMCkKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfRCwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJDIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludHJhX0wsIHltYXg9VHVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRCwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJDIiApLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MSAmIEVudj09IkNkIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLTEsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogICAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiBULiB1cnRpY2FlIikrCiAgZ2d0aXRsZSgiVHUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvT3B0aW1fbm9ybWFsL3ByZWRfVHVfSU5UUkFfQ29udHJvbF9jYWRtaXVtLnBkZiIsIHdpZHRoPTI1LCBoZWlnaHQ9MTApCgojc3Vic2V0KHByZWRfZGZfRCwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJDIiAmIFJlcGxpY2F0ZT09MykKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfRCwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludHJhX0wsIHltYXg9VGVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRCwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NCAmIEVudj09Ik4iICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMtMSwgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIFQuIGV2YW5zaSIpKwogIGdndGl0bGUoIlRlIGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL09wdGltX25vcm1hbC9wcmVkX1RlX0lOVFJBX0NvbnRyb2xfY29udHJvbC5wZGYiLCB3aWR0aD0yNSwgaGVpZ2h0PTEwKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0QsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRyYV9MLCB5bWF4PVRlX2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0QsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucy0xLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICAgIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gVC4gZXZhbnNpIikrCiAgZ2d0aXRsZSgiVGUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvT3B0aW1fbm9ybWFsL3ByZWRfVGVfSU5UUkFfQ29udHJvbF9jYWRtaXVtLnBkZiIsIHdpZHRoPTI1LCBoZWlnaHQ9MTApCgpgYGAKCgojIyMgRSAtIG9wdGltIGxhbWJkYSBmaXhlZAoKIyMjIyMgRXN0aW1hdGUgcGFyYW1ldGVycwoKYGBge3J9CgojIGNyZWF0aW5nIGZvbGRlciB0byBwdXQgdGhlIGFuYWx5c2VzIGluc2lkZSwgdGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGZpbGUgcGF0aCBpbiB0aGUgZnVuY3Rpb24KZGlyLmNyZWF0ZSgiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQiLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKCnNvdXJjZSgiLi9mdW5jdGlvbl9yaWtlcl8yN01heS5SIikKIyBUaGlzIG1hdHJpeCBoYXMgYWxsIHRoZSBjb21wYXJpc29ucyB0aGF0IG5lZWQgdG8gYmUgZG9uZSBiZXR3ZWVuIHJlZ2ltZXMKY29tcGFyaXNvbl9tYXQ8LW1hdHJpeChucm93PTQsIG5jb2w9MykKICBjb21wYXJpc29uX21hdFsxLF08LWMoMSw0LDUpCiAgY29tcGFyaXNvbl9tYXRbMixdPC1jKDIsNCw1KQogIGNvbXBhcmlzb25fbWF0WzMsXTwtYyg0LDEsMikKICBjb21wYXJpc29uX21hdFs0LF08LWMoNSwxLDIpCiAgCgojbGFtMiBpcyB0aGUgZGF0YSBmcm9tIGRlbnNpdHkgb25lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZvY2FscyBwb3B1bGF0aW9ucwojIGRhdGEyIGlzIHRoZSBkYXRhIChmb3JtYXQpIFJlZ2ltZSAobmFtZSBvZiBmb2NhbCBwb3ApLCBiYWNrZ3JvdW5kIChuYW1lIG9mIGNvbXBldGl0b3IsIHRoZSBzYW1lIGlmIGl0cyBpbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uKSwgZm9jYWwgKG51bWJlciBvZiBmb2NhbCBpbmRpdmlkdWFscyBpbiBnMCksIGNvbXAgKG51bWJlciBvZiBjb21wZXRpdG9ycyBpbiBnMCksIGdyb3d0aCByYXRlCiAgIyBBdHRlbnRpb24gdGhhdCBmb3IgaW50cmFzcGVjaWZpYyB5b3UgbmVlZCB0byBhZGQgMCBpbiB0aGUgY29tcCBhbmQgYWxsIGluZGl2aWR1YWxzIGluIHRoZSBmb2NhbAoKcmVwMjwtbW9kX2RmKHN1YnNldChjYSxSZXA9PTEgJiBFbnY9PSJOIikpICAKbWFnaWNfcmtfbGFtYmRhKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8iLGRhdGEyPXJlcDIsIHJlcHMyPTEsIGVudj0iTiIsIGNvbXBhcmlzb25zID0gY29tcGFyaXNvbl9tYXQsIGxhbTI9c3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MSAmIEVudj09Ik4iKSkKCnJlcDI8LW1vZF9kZihzdWJzZXQoY2EsUmVwPT0xICYgRW52PT0iQ2QiKSkKbWFnaWNfcmtfbGFtYmRhKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8iLCBkYXRhMj1yZXAyLCByZXBzMj0xLCBlbnY9IkNkIiwgY29tcGFyaXNvbnMgPSBjb21wYXJpc29uX21hdCwgbGFtMj1zdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0xICYgRW52PT0iQ2QiKSkKCnJlcDI8LW1vZF9kZihzdWJzZXQoY2EsUmVwPT0zICYgRW52PT0iTiIpKQptYWdpY19ya19sYW1iZGEoZmlsZXBhdGgyID0gIi4vTmV3QW5hbHlzZXMvb3B0aW1fbGFtYmRhX2ZpeGVkLyIsICBkYXRhMj1yZXAyLCByZXBzMj0zLCBlbnY9Ik4iLCBjb21wYXJpc29ucyA9IGNvbXBhcmlzb25fbWF0LCBsYW0yPXN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTMgJiBFbnY9PSJOIikpCgpyZXAyPC1tb2RfZGYoc3Vic2V0KGNhLFJlcD09MyAmIEVudj09IkNkIikpCm1hZ2ljX3JrX2xhbWJkYShmaWxlcGF0aDIgPSAiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvIiwgZGF0YTI9cmVwMiwgcmVwczI9MywgZW52PSJDZCIsIGNvbXBhcmlzb25zID0gY29tcGFyaXNvbl9tYXQsIGxhbTI9c3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MyAmIEVudj09IkNkIikpCgpyZXAyPC1tb2RfZGYoc3Vic2V0KGNhLFJlcD09NCAmIEVudj09Ik4iKSkKbWFnaWNfcmtfbGFtYmRhKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8iLCBkYXRhMj1yZXAyLCByZXBzMj00LCBlbnY9Ik4iLCBjb21wYXJpc29ucyA9IGNvbXBhcmlzb25fbWF0LCBsYW0yPXN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTQgJiBFbnY9PSJOIikpCgpyZXAyPC1tb2RfZGYoc3Vic2V0KGNhLFJlcD09NCAmIEVudj09IkNkIikpCm1hZ2ljX3JrX2xhbWJkYShmaWxlcGF0aDIgPSAiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvIiwgZGF0YTI9cmVwMiwgcmVwczI9NCwgZW52PSJDZCIsIGNvbXBhcmlzb25zID0gY29tcGFyaXNvbl9tYXQsIGxhbTI9c3Vic2V0KG1lYW5fZGVuczEsIFJlcD09NCAmIEVudj09IkNkIikpCgpyZXAyPC1tb2RfZGYoc3Vic2V0KGNhLFJlcD09NSAmIEVudj09Ik4iKSkKbWFnaWNfcmtfbGFtYmRhKGZpbGVwYXRoMiA9ICIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8iLCBkYXRhMj1yZXAyLCByZXBzMj01LCBlbnY9Ik4iLCBjb21wYXJpc29ucyA9IGNvbXBhcmlzb25fbWF0LCBsYW0yPXN1YnNldChtZWFuX2RlbnMxLCBSZXA9PTUgJiBFbnY9PSJOIikpCgpyZXAyPC1tb2RfZGYoc3Vic2V0KGNhLFJlcD09NSAmIEVudj09IkNkIikpCm1hZ2ljX3JrX2xhbWJkYShmaWxlcGF0aDIgPSAiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvIixkYXRhMj1yZXAyLCByZXBzMj01LCBlbnY9IkNkIiwgY29tcGFyaXNvbnMgPSBjb21wYXJpc29uX21hdCwgbGFtMj1zdWJzZXQobWVhbl9kZW5zMSwgUmVwPT01ICYgRW52PT0iQ2QiKSkKCiMgRm9yIHR3byB3ZSBoYXZlIHRvIGNoYW5nZSB0aGUgY29tcGFyaXNvbiBtYXRyaXgKY29tcGFyaXNvbl9tYXQyPC1tYXRyaXgobnJvdz0zLCBuY29sPTMpCiAgY29tcGFyaXNvbl9tYXQyWzEsXTwtYygxLDQsNSkKICBjb21wYXJpc29uX21hdDJbMixdPC1jKDQsMSxOQSkKICBjb21wYXJpc29uX21hdDJbMyxdPC1jKDUsMSxOQSkKCnJlcDI8LW1vZF9kZihzdWJzZXQoY2EsUmVwPT0yICYgRW52PT0iTiIpKQptYWdpY19ya19sYW1iZGEoZmlsZXBhdGgyID0gIi4vTmV3QW5hbHlzZXMvb3B0aW1fbGFtYmRhX2ZpeGVkLyIsICBkYXRhMj1yZXAyLCByZXBzMj0yLCBlbnY9Ik4iLCBjb21wYXJpc29ucyA9IGNvbXBhcmlzb25fbWF0MiwgbGFtMj1zdWJzZXQobWVhbl9kZW5zMSwgUmVwPT0yICYgRW52PT0iTiIpKQoKcmVwMjwtbW9kX2RmKHN1YnNldChjYSxSZXA9PTIgJiBFbnY9PSJDZCIpKQptYWdpY19ya19sYW1iZGEoZmlsZXBhdGgyID0gIi4vTmV3QW5hbHlzZXMvb3B0aW1fbGFtYmRhX2ZpeGVkLyIsICBkYXRhMj1yZXAyLCByZXBzMj0yLCBlbnY9IkNkIiwgY29tcGFyaXNvbnMgPSBjb21wYXJpc29uX21hdDIsIGxhbTI9c3Vic2V0KG1lYW5fZGVuczEsIFJlcD09MiAmIEVudj09IkNkIikpCgoKYGBgCgoKCiMjIyMjIEltcG9ydGluZyBmaWxlcyBvZiBhbHBoYSBhbmQgbGFtYmRhCgpgYGB7cn0KYWxwaGFfZmlsZTwtbGlzdC5maWxlcygiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvIiwgcGF0dGVybj0iYWxwaGFfZXN0aW1hdGVzIikgI3RoZSBhbHBoYXMgYXJlIGFsd2F5cyB0dSwgdGUgKHJvdyksIHR1LCB0ZSAoY29sKQoKYWxwaGFVcHBlcl9maWxlPC1saXN0LmZpbGVzKCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8iLCBwYXR0ZXJuPSJhbHBoYV91cHBlciIpCgphbHBoYUxvd2VyX2ZpbGU8LWxpc3QuZmlsZXMoIi4vTmV3QW5hbHlzZXMvb3B0aW1fbGFtYmRhX2ZpeGVkLyIsIHBhdHRlcm49ImFscGhhX2xvd2VyIikKCmxhbWJkYV9maWxlPC1saXN0LmZpbGVzKCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8iLCBwYXR0ZXJuPSJsYW1iZGFfZXN0aW1hdGVzIikKCgphbHBoYV9saXN0PC0gbGFwcGx5KGFscGhhX2ZpbGUsIGZ1bmN0aW9uKHgpIHJlYWQuY3N2KHBhc3RlKCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8iLHgsIHNlcD0iIiksIGhlYWRlciA9IFRSVUUpKQphbHBoYVVwcGVyX2xpc3Q8LSBsYXBwbHkoYWxwaGFVcHBlcl9maWxlLCBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZSgiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvIix4LCBzZXA9IiIpLCBoZWFkZXIgPSBUUlVFKSkKYWxwaGFMb3dlcl9saXN0PC0gbGFwcGx5KGFscGhhTG93ZXJfZmlsZSwgZnVuY3Rpb24oeCkgcmVhZC5jc3YocGFzdGUoIi4vTmV3QW5hbHlzZXMvb3B0aW1fbGFtYmRhX2ZpeGVkLyIseCwgc2VwPSIiKSwgaGVhZGVyID0gVFJVRSkpCmxhbWJkYV9saXN0PC0gbGFwcGx5KGxhbWJkYV9maWxlLCBmdW5jdGlvbih4KSByZWFkLmNzdihwYXN0ZSgiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvIix4LCBzZXA9IiIpLCBoZWFkZXIgPSBUUlVFKSkKCiMgcGFzc2luZyBmcm9tIGxpc3QgdG8gZGF0YSBmcmFtZQojIEZpcnN0IHdlIG5lZWQgdG8gZG8gdGhlIGZpcnN0IGl0ZXJhdGlvbiAodG8gY3JlYXRlIGV2ZXJ5dGhpbmcpCmxhbWJkYV9pbnRyYV9maXhlZDwtZGF0YS5mcmFtZShSZWdpbWUxPXJlcChjKDEsMSwyLDIpLDEwKSwgUmVnaW1lMj1yZXAoYyg0LDUsNCw1KSwgMTApLCBSZXBsaWNhdGU9YyhyZXAoMSw4KSxyZXAoMiw4KSxyZXAoMyw4KSxyZXAoNCw4KSxyZXAoNSw4KSksIEVudj1yZXAoYyhyZXAoIk4iLDQpLCByZXAoIkNkIiw0KSksIDUpKQoKbGFtYmRhX2ludHJhX2ZpeGVkPC1sYW1iZGFfaW50cmFfZml4ZWRbLXdoaWNoKGxhbWJkYV9pbnRyYV9maXhlZCRSZWdpbWUxPT0yICYgbGFtYmRhX2ludHJhX2ZpeGVkJFJlcGxpY2F0ZT09MiksXSAjIHRvIHJlbW92ZSBTUjIgZnJvbSByZXBsaWNhdGUgMiBiZWNhdXNlIGl0IGRvZXMgbm90IGV4aXN0CgphbHBoYV9saXN0W1sxXV0KbGFtYmRhX2xpc3RbWzFdXQoKIyBwYXNzaW5nIGFscGhhcyB0byBkYXRhZnJhbWUKcmVwbGk8LXVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KGFscGhhX2ZpbGVbMV0sIHNwbGl0PSJfIilbMV0pWzZdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMV0KICBlbnY8LXVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KGFscGhhX2ZpbGVbMV0sIHNwbGl0PSJfIilbMV0pWzZdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKcmVnaW1lVHU8LWMoIjEiLCIxIiwgIjIiLCIyIikKcmVnaW1lVGU8LWMoIjQiLCI1IiwgIjQiLCI1IikKRW52PC1yZXAoZW52LCA0KQpSZXA8LXJlcChyZXBsaSw0KQoKYXV4X2FscGhhPC1hcy5kYXRhLmZyYW1lKGFscGhhX2xpc3RbWzFdXSkKCmF1eF9hbHBoYTI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdT1jKGF1eF9hbHBoYVsxLDJdLCBhdXhfYWxwaGFbMSwyXSwgYXV4X2FscGhhWzIsMl0sYXV4X2FscGhhWzIsMl0pLCBpbnRyYVRlPWMoYXV4X2FscGhhWzMsMl0sIGF1eF9hbHBoYVs0LDJdLCBhdXhfYWxwaGFbMywyXSxhdXhfYWxwaGFbNCwyXSksIGludGVyVHU9YyhhdXhfYWxwaGFbMSwzXSwgYXV4X2FscGhhWzEsNF0sIGF1eF9hbHBoYVsyLDNdLCBhdXhfYWxwaGFbMiw0XSksIGludGVyVGU9YyhhdXhfYWxwaGFbMywzXSwgYXV4X2FscGhhWzQsM10sIGF1eF9hbHBoYVszLDRdLCBhdXhfYWxwaGFbNCw0XSkpCgpmb3IoeCBpbiAyOmxlbmd0aChsYW1iZGFfbGlzdCkpewogIHJlcGxpPC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYV9maWxlW3hdLCBzcGxpdD0iXyIpWzFdKVs2XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYV9maWxlW3hdLCBzcGxpdD0iXyIpWzFdKVs2XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzJdCiAgCiAgaWYoeD09MyB8IHg9PTQpeyMgYmVjYXVzZSB0aGVyZSBpcyBubyBTUjIgaGVyZQogICAgcmVnaW1lVHU8LWMoIjEiLCIxIikKICAgIHJlZ2ltZVRlPC1jKCI0IiwiNSIpCiAgICBFbnY8LXJlcChlbnYsIDIpCiAgICBSZXA8LXJlcChyZXBsaSwyKQogICAgCiAgICBhdXhfYWxwaGE8LWFzLmRhdGEuZnJhbWUoYWxwaGFfbGlzdFtbeF1dKQogICAgCiAgICBhdXgyPC1kYXRhLmZyYW1lKHJlZ2ltZVR1LCByZWdpbWVUZSwgRW52LCBSZXAsIGludHJhVHU9YyhhdXhfYWxwaGFbMSwyXSwgYXV4X2FscGhhWzEsMl0pLCBpbnRyYVRlPWMoYXV4X2FscGhhWzIsMl0sIGF1eF9hbHBoYVszLDJdKSwgaW50ZXJUdT1jKGF1eF9hbHBoYVsxLDNdLCBhdXhfYWxwaGFbMSw0XSksIGludGVyVGU9YyhhdXhfYWxwaGFbMiwzXSwgYXV4X2FscGhhWzMsM10pKQogICAgCiAgICAKICB9ZWxzZXsKICAgIHJlZ2ltZVR1PC1jKCIxIiwiMSIsICIyIiwiMiIpCiAgICByZWdpbWVUZTwtYygiNCIsIjUiLCAiNCIsIjUiKQogICAgRW52PC1yZXAoZW52LCA0KQogICAgUmVwPC1yZXAocmVwbGksNCkKICAgIAogICAgYXV4X2FscGhhPC1hcy5kYXRhLmZyYW1lKGFscGhhX2xpc3RbW3hdXSkKICAgIAogICAgYXV4MjwtZGF0YS5mcmFtZShyZWdpbWVUdSwgcmVnaW1lVGUsIEVudiwgUmVwLCBpbnRyYVR1PWMoYXV4X2FscGhhWzEsMl0sIGF1eF9hbHBoYVsxLDJdLCBhdXhfYWxwaGFbMiwyXSxhdXhfYWxwaGFbMiwyXSksIGludHJhVGU9YyhhdXhfYWxwaGFbMywyXSwgYXV4X2FscGhhWzQsMl0sIGF1eF9hbHBoYVszLDJdLGF1eF9hbHBoYVs0LDJdKSwgaW50ZXJUdT1jKGF1eF9hbHBoYVsxLDNdLCBhdXhfYWxwaGFbMSw0XSwgYXV4X2FscGhhWzIsM10sIGF1eF9hbHBoYVsyLDRdKSwgaW50ZXJUZT1jKGF1eF9hbHBoYVszLDNdLCBhdXhfYWxwaGFbNCwzXSwgYXV4X2FscGhhWzMsNF0sIGF1eF9hbHBoYVs0LDRdKSkKICB9CiAgCiAgYXV4X2FscGhhMjwtcmJpbmQoYXV4X2FscGhhMiwgYXV4MikKfQoKIyMjIEFscGhhIExvd2VyCgojIHBhc3NpbmcgYWxwaGFzIHRvIGRhdGFmcmFtZQpyZXBsaTwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQoYWxwaGFMb3dlcl9maWxlWzFdLCBzcGxpdD0iXyIpWzFdKVs0XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYUxvd2VyX2ZpbGVbMV0sIHNwbGl0PSJfIilbMV0pWzRdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKcmVnaW1lVHU8LWMoIjEiLCIxIiwgIjIiLCIyIikKcmVnaW1lVGU8LWMoIjQiLCI1IiwgIjQiLCI1IikKRW52PC1yZXAoZW52LCA0KQpSZXA8LXJlcChyZXBsaSw0KQoKYXV4X2FscGhhTG93ZXI8LWFzLmRhdGEuZnJhbWUoYWxwaGFMb3dlcl9saXN0W1sxXV0pCgphdXhfYWxwaGFMb3dlcjI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwyXSwgYXV4X2FscGhhTG93ZXJbMSwyXSwgYXV4X2FscGhhTG93ZXJbMiwyXSxhdXhfYWxwaGFMb3dlclsyLDJdKSwgaW50cmFUZV9MPWMoYXV4X2FscGhhTG93ZXJbMywyXSwgYXV4X2FscGhhTG93ZXJbNCwyXSwgYXV4X2FscGhhTG93ZXJbMywyXSxhdXhfYWxwaGFMb3dlcls0LDJdKSwgaW50ZXJUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwzXSwgYXV4X2FscGhhTG93ZXJbMSw0XSwgYXV4X2FscGhhTG93ZXJbMiwzXSwgYXV4X2FscGhhTG93ZXJbMiw0XSksIGludGVyVGVfTD1jKGF1eF9hbHBoYUxvd2VyWzMsM10sIGF1eF9hbHBoYUxvd2VyWzQsM10sIGF1eF9hbHBoYUxvd2VyWzMsNF0sIGF1eF9hbHBoYUxvd2VyWzQsNF0pKQoKZm9yKHggaW4gMjpsZW5ndGgobGFtYmRhX2xpc3QpKXsKICByZXBsaTwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQoYWxwaGFMb3dlcl9maWxlW3hdLCBzcGxpdD0iXyIpWzFdKVs0XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYUxvd2VyX2ZpbGVbeF0sIHNwbGl0PSJfIilbMV0pWzRdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKICBpZih4PT0zIHwgeD09NCl7IyBiZWNhdXNlIHRoZXJlIGlzIG5vIFNSMiBoZXJlCiAgICByZWdpbWVUdTwtYygiMSIsIjEiKQogICAgcmVnaW1lVGU8LWMoIjQiLCI1IikKICAgIEVudjwtcmVwKGVudiwgMikKICAgIFJlcDwtcmVwKHJlcGxpLDIpCiAgICAKICAgIGF1eF9hbHBoYUxvd2VyPC1hcy5kYXRhLmZyYW1lKGFscGhhTG93ZXJfbGlzdFtbeF1dKQogICAgCiAgICBhdXgyPC1kYXRhLmZyYW1lKHJlZ2ltZVR1LCByZWdpbWVUZSwgRW52LCBSZXAsIGludHJhVHVfTD1jKGF1eF9hbHBoYUxvd2VyWzEsMl0sIGF1eF9hbHBoYUxvd2VyWzEsMl0pLCBpbnRyYVRlX0w9YyhhdXhfYWxwaGFMb3dlclsyLDJdLCBhdXhfYWxwaGFMb3dlclszLDJdKSwgaW50ZXJUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwzXSwgYXV4X2FscGhhTG93ZXJbMSw0XSksIGludGVyVGVfTD1jKGF1eF9hbHBoYUxvd2VyWzIsM10sIGF1eF9hbHBoYUxvd2VyWzMsM10pKQogICAgCiAgICAKICB9ZWxzZXsKICAgIHJlZ2ltZVR1PC1jKCIxIiwiMSIsICIyIiwiMiIpCiAgICByZWdpbWVUZTwtYygiNCIsIjUiLCAiNCIsIjUiKQogICAgRW52PC1yZXAoZW52LCA0KQogICAgUmVwPC1yZXAocmVwbGksNCkKICAgIAogICAgYXV4X2FscGhhTG93ZXI8LWFzLmRhdGEuZnJhbWUoYWxwaGFMb3dlcl9saXN0W1t4XV0pCiAgICAKICAgIGF1eDI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwyXSwgYXV4X2FscGhhTG93ZXJbMSwyXSwgYXV4X2FscGhhTG93ZXJbMiwyXSxhdXhfYWxwaGFMb3dlclsyLDJdKSwgaW50cmFUZV9MPWMoYXV4X2FscGhhTG93ZXJbMywyXSwgYXV4X2FscGhhTG93ZXJbNCwyXSwgYXV4X2FscGhhTG93ZXJbMywyXSxhdXhfYWxwaGFMb3dlcls0LDJdKSwgaW50ZXJUdV9MPWMoYXV4X2FscGhhTG93ZXJbMSwzXSwgYXV4X2FscGhhTG93ZXJbMSw0XSwgYXV4X2FscGhhTG93ZXJbMiwzXSwgYXV4X2FscGhhTG93ZXJbMiw0XSksIGludGVyVGVfTD1jKGF1eF9hbHBoYUxvd2VyWzMsM10sIGF1eF9hbHBoYUxvd2VyWzQsM10sIGF1eF9hbHBoYUxvd2VyWzMsNF0sIGF1eF9hbHBoYUxvd2VyWzQsNF0pKQogIH0KICAKICBhdXhfYWxwaGFMb3dlcjI8LXJiaW5kKGF1eF9hbHBoYUxvd2VyMiwgYXV4MikKfQoKIyMjIEFscGhhIFVwcGVyCgojIHBhc3NpbmcgYWxwaGFzIHRvIGRhdGFmcmFtZQpyZXBsaTwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQoYWxwaGFVcHBlcl9maWxlWzFdLCBzcGxpdD0iXyIpWzFdKVs0XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYVVwcGVyX2ZpbGVbMV0sIHNwbGl0PSJfIilbMV0pWzRdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKcmVnaW1lVHU8LWMoIjEiLCIxIiwgIjIiLCIyIikKcmVnaW1lVGU8LWMoIjQiLCI1IiwgIjQiLCI1IikKRW52PC1yZXAoZW52LCA0KQpSZXA8LXJlcChyZXBsaSw0KQoKYXV4X2FscGhhVXBwZXI8LWFzLmRhdGEuZnJhbWUoYWxwaGFVcHBlcl9saXN0W1sxXV0pCgphdXhfYWxwaGFVcHBlcjI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwyXSwgYXV4X2FscGhhVXBwZXJbMSwyXSwgYXV4X2FscGhhVXBwZXJbMiwyXSxhdXhfYWxwaGFVcHBlclsyLDJdKSwgaW50cmFUZV9VPWMoYXV4X2FscGhhVXBwZXJbMywyXSwgYXV4X2FscGhhVXBwZXJbNCwyXSwgYXV4X2FscGhhVXBwZXJbMywyXSxhdXhfYWxwaGFVcHBlcls0LDJdKSwgaW50ZXJUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwzXSwgYXV4X2FscGhhVXBwZXJbMSw0XSwgYXV4X2FscGhhVXBwZXJbMiwzXSwgYXV4X2FscGhhVXBwZXJbMiw0XSksIGludGVyVGVfVT1jKGF1eF9hbHBoYVVwcGVyWzMsM10sIGF1eF9hbHBoYVVwcGVyWzQsM10sIGF1eF9hbHBoYVVwcGVyWzMsNF0sIGF1eF9hbHBoYVVwcGVyWzQsNF0pKQoKZm9yKHggaW4gMjpsZW5ndGgobGFtYmRhX2xpc3QpKXsKICByZXBsaTwtdW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQoYWxwaGFVcHBlcl9maWxlW3hdLCBzcGxpdD0iXyIpWzFdKVs0XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYVVwcGVyX2ZpbGVbeF0sIHNwbGl0PSJfIilbMV0pWzRdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKICBpZih4PT0zIHwgeD09NCl7IyBiZWNhdXNlIHRoZXJlIGlzIG5vIFNSMiBoZXJlCiAgICByZWdpbWVUdTwtYygiMSIsIjEiKQogICAgcmVnaW1lVGU8LWMoIjQiLCI1IikKICAgIEVudjwtcmVwKGVudiwgMikKICAgIFJlcDwtcmVwKHJlcGxpLDIpCiAgICAKICAgIGF1eF9hbHBoYVVwcGVyPC1hcy5kYXRhLmZyYW1lKGFscGhhVXBwZXJfbGlzdFtbeF1dKQogICAgCiAgICBhdXgyPC1kYXRhLmZyYW1lKHJlZ2ltZVR1LCByZWdpbWVUZSwgRW52LCBSZXAsIGludHJhVHVfVT1jKGF1eF9hbHBoYVVwcGVyWzEsMl0sIGF1eF9hbHBoYVVwcGVyWzEsMl0pLCBpbnRyYVRlX1U9YyhhdXhfYWxwaGFVcHBlclsyLDJdLCBhdXhfYWxwaGFVcHBlclszLDJdKSwgaW50ZXJUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwzXSwgYXV4X2FscGhhVXBwZXJbMSw0XSksIGludGVyVGVfVT1jKGF1eF9hbHBoYVVwcGVyWzIsM10sIGF1eF9hbHBoYVVwcGVyWzMsM10pKQogICAgCiAgICAKICB9ZWxzZXsKICAgIHJlZ2ltZVR1PC1jKCIxIiwiMSIsICIyIiwiMiIpCiAgICByZWdpbWVUZTwtYygiNCIsIjUiLCAiNCIsIjUiKQogICAgRW52PC1yZXAoZW52LCA0KQogICAgUmVwPC1yZXAocmVwbGksNCkKICAgIAogICAgYXV4X2FscGhhVXBwZXI8LWFzLmRhdGEuZnJhbWUoYWxwaGFVcHBlcl9saXN0W1t4XV0pCiAgICAKICAgIGF1eDI8LWRhdGEuZnJhbWUocmVnaW1lVHUsIHJlZ2ltZVRlLCBFbnYsIFJlcCwgaW50cmFUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwyXSwgYXV4X2FscGhhVXBwZXJbMSwyXSwgYXV4X2FscGhhVXBwZXJbMiwyXSxhdXhfYWxwaGFVcHBlclsyLDJdKSwgaW50cmFUZV9VPWMoYXV4X2FscGhhVXBwZXJbMywyXSwgYXV4X2FscGhhVXBwZXJbNCwyXSwgYXV4X2FscGhhVXBwZXJbMywyXSxhdXhfYWxwaGFVcHBlcls0LDJdKSwgaW50ZXJUdV9VPWMoYXV4X2FscGhhVXBwZXJbMSwzXSwgYXV4X2FscGhhVXBwZXJbMSw0XSwgYXV4X2FscGhhVXBwZXJbMiwzXSwgYXV4X2FscGhhVXBwZXJbMiw0XSksIGludGVyVGVfVT1jKGF1eF9hbHBoYVVwcGVyWzMsM10sIGF1eF9hbHBoYVVwcGVyWzQsM10sIGF1eF9hbHBoYVVwcGVyWzMsNF0sIGF1eF9hbHBoYVVwcGVyWzQsNF0pKQogIH0KICAKICBhdXhfYWxwaGFVcHBlcjI8LXJiaW5kKGF1eF9hbHBoYVVwcGVyMiwgYXV4MikKfQoKIyBQYXNzaW5nIGxhbWJkYSB0byBkYXRhIGZyYW1lCnJlcGxpPC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYV9maWxlWzFdLCBzcGxpdD0iXyIpWzFdKVs2XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzFdCiAgZW52PC11bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KHVubGlzdChzdHJzcGxpdChhbHBoYV9maWxlWzFdLCBzcGxpdD0iXyIpWzFdKVs2XSwgc3BsaXQ9IlsuXSIpKVsxXSxzcGxpdD0iIikpWzJdCiAgCkZvY2FsPC1jKCIxIiwiMSIsIjIiLCIyIiwiNCIsIjQiLCI1IiwiNSIpCkNvbXA8LWMoIjQiLCI1IiwiNCIsIjUiLCIxIiwiMiIsIjEiLCIyIikKRW52PC1yZXAoZW52LCA4KQpSZXA8LXJlcChyZXBsaSw4KQogICAgCmF1eF9sYW1iZGE8LWNiaW5kKGFzLmRhdGEuZnJhbWUobGFtYmRhX2xpc3RbWzFdXSlbLGMoMyw0LDUpXSxGb2NhbCxDb21wLCBFbnYsIFJlcCkKCmZvcih4IGluIDI6bGVuZ3RoKGxhbWJkYV9saXN0KSl7CiAgcmVwbGk8LXVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KGFscGhhX2ZpbGVbeF0sIHNwbGl0PSJfIilbMV0pWzZdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMV0KICBlbnY8LXVubGlzdChzdHJzcGxpdCh1bmxpc3Qoc3Ryc3BsaXQodW5saXN0KHN0cnNwbGl0KGFscGhhX2ZpbGVbeF0sIHNwbGl0PSJfIilbMV0pWzZdLCBzcGxpdD0iWy5dIikpWzFdLHNwbGl0PSIiKSlbMl0KICAKICBpZih4PT0zIHwgeD09NCl7IyBiZWNhdXNlIHRoZXJlIGlzIG5vIFNSMiBoZXJlCiAgICBGb2NhbDwtYygiMSIsIjEiLCI0IiwiNSIpCiAgICBDb21wPC1jKCI0IiwiNSIsIjEiLCIxIikKICAgIEVudjwtcmVwKGVudiwgNCkKICAgIFJlcDwtcmVwKHJlcGxpLDQpCiAgICAKICAgIGF1eDwtY2JpbmQoYXMuZGF0YS5mcmFtZShsYW1iZGFfbGlzdFtbeF1dKVssYygzLDQsNSldLEZvY2FsLENvbXAsIEVudiwgUmVwKQogICAgCiAgfWVsc2V7CiAgICBGb2NhbDwtYygiMSIsIjEiLCIyIiwiMiIsIjQiLCI0IiwiNSIsIjUiKQogICAgQ29tcDwtYygiNCIsIjUiLCI0IiwiNSIsIjEiLCIyIiwiMSIsIjIiKQogICAgRW52PC1yZXAoZW52LCA4KQogICAgUmVwPC1yZXAocmVwbGksOCkKICAgIAogICAgYXV4PC1jYmluZChhcy5kYXRhLmZyYW1lKGxhbWJkYV9saXN0W1t4XV0pWyxjKDMsNCw1KV0sRm9jYWwsQ29tcCwgRW52LCBSZXApCiAgfQogIAogIGF1eF9sYW1iZGE8LXJiaW5kKGF1eF9sYW1iZGEsIGF1eCkKfQoKCiNNYXRjaGluZyBhbGwgdGhlIGRhdGEKCmFscGhhc19tYXRfRTwtYXMuZGF0YS5mcmFtZShjYmluZChhdXhfYWxwaGEyLCBhdXhfYWxwaGFMb3dlcjIsIGF1eF9hbHBoYVVwcGVyMikpCgpzdHIobGFtYmRhX2ludHJhX2ZpeGVkKQoKIyMjIyBhZGRpbmcgbGFtYmRhCgphbHBoYXNfbWF0X0UkbGFtYmRhVHU8LXNhcHBseShjKDE6bGVuZ3RoKGFscGhhc19tYXRfRVssMV0pKSwgZnVuY3Rpb24oeCl7CiAgYXV4aTwtc3Vic2V0KGF1eF9sYW1iZGEsIChGb2NhbD09YWxwaGFzX21hdF9FJHJlZ2ltZVR1W3hdICYgQ29tcD09YWxwaGFzX21hdF9FJHJlZ2ltZVRlW3hdKSAmIFJlcD09YWxwaGFzX21hdF9FJFJlcFt4XSAmIEVudj09YWxwaGFzX21hdF9FJEVudlt4XSApCiAgCiAgYXV4aVsxLDFdCn0pCgphbHBoYXNfbWF0X0UkbGFtYmRhVGU8LXNhcHBseShjKDE6bGVuZ3RoKGFscGhhc19tYXRfRVssMV0pKSwgZnVuY3Rpb24oeCl7CiAgYXV4aTwtc3Vic2V0KGF1eF9sYW1iZGEsIChGb2NhbD09YWxwaGFzX21hdF9FJHJlZ2ltZVRlW3hdICYgQ29tcD09YWxwaGFzX21hdF9FJHJlZ2ltZVR1W3hdKSAmIFJlcD09YWxwaGFzX21hdF9FJFJlcFt4XSAmIEVudj09YWxwaGFzX21hdF9FJEVudlt4XSApCiAgCiAgYXV4aVsxLDFdCn0pCgoKYWxwaGFzX21hdF9FJGxhbWJkYVR1X0w8LXNhcHBseShjKDE6bGVuZ3RoKGFscGhhc19tYXRfRVssMV0pKSwgZnVuY3Rpb24oeCl7CiAgYXV4aTwtc3Vic2V0KGF1eF9sYW1iZGEsIChGb2NhbD09YWxwaGFzX21hdF9FJHJlZ2ltZVR1W3hdICYgQ29tcD09YWxwaGFzX21hdF9FJHJlZ2ltZVRlW3hdKSAmIFJlcD09YWxwaGFzX21hdF9FJFJlcFt4XSAmIEVudj09YWxwaGFzX21hdF9FJEVudlt4XSApCiAgCiAgYXV4aVsxLDJdCn0pCgphbHBoYXNfbWF0X0UkbGFtYmRhVGVfTDwtc2FwcGx5KGMoMTpsZW5ndGgoYWxwaGFzX21hdF9FWywxXSkpLCBmdW5jdGlvbih4KXsKICBhdXhpPC1zdWJzZXQoYXV4X2xhbWJkYSwgKEZvY2FsPT1hbHBoYXNfbWF0X0UkcmVnaW1lVGVbeF0gJiBDb21wPT1hbHBoYXNfbWF0X0UkcmVnaW1lVHVbeF0pICYgUmVwPT1hbHBoYXNfbWF0X0UkUmVwW3hdICYgRW52PT1hbHBoYXNfbWF0X0UkRW52W3hdICkKICAKICBhdXhpWzEsMl0KfSkKCmFscGhhc19tYXRfRSRsYW1iZGFUdV9VPC1zYXBwbHkoYygxOmxlbmd0aChhbHBoYXNfbWF0X0VbLDFdKSksIGZ1bmN0aW9uKHgpewogIGF1eGk8LXN1YnNldChhdXhfbGFtYmRhLCAoRm9jYWw9PWFscGhhc19tYXRfRSRyZWdpbWVUdVt4XSAmIENvbXA9PWFscGhhc19tYXRfRSRyZWdpbWVUZVt4XSkgJiBSZXA9PWFscGhhc19tYXRfRSRSZXBbeF0gJiBFbnY9PWFscGhhc19tYXRfRSRFbnZbeF0gKQogIAogIGF1eGlbMSwzXQp9KQoKYWxwaGFzX21hdF9FJGxhbWJkYVRlX1U8LXNhcHBseShjKDE6bGVuZ3RoKGFscGhhc19tYXRfRVssMV0pKSwgZnVuY3Rpb24oeCl7CiAgYXV4aTwtc3Vic2V0KGF1eF9sYW1iZGEsIChGb2NhbD09YWxwaGFzX21hdF9FJHJlZ2ltZVRlW3hdICYgQ29tcD09YWxwaGFzX21hdF9FJHJlZ2ltZVR1W3hdKSAmIFJlcD09YWxwaGFzX21hdF9FJFJlcFt4XSAmIEVudj09YWxwaGFzX21hdF9FJEVudlt4XSApCiAgCiAgYXV4aVsxLDNdCn0pCgphbHBoYXNfbWF0X0UkRW52MjwtbWFwdmFsdWVzKGFscGhhc19tYXRfRSRFbnYsIGMoIkMiLCJOIiksIGMoIkNkIiwiTiIpKQoKIyBjbGVhbiB1cCB0aGUgbWF0cml4LCBiZWNhdXNlIGl0IGhhcyBhIGxvdCBvZiByZXBlYXRlZCBjb2x1bW5zCmFscGhhc19tYXRfRTwtYWxwaGFzX21hdF9FWyxjKDE6OCwgMTM6MTYsMjE6MzApXQoKYWxwaGFzX21hdF9FCgpgYGAKCiMjIyMgUGxvdHRpbmcgZGF0YQoKYGBge3J9CiMjIyBQbG90dGluZyBkYXRhCgpjb2xuYW1lcyhhbHBoYXNfbWF0X0UpPC1jKCJUdV9SZWdpbWUiLCAiVGVfUmVnaW1lIiwgIkVudmlyb25tZW50IiwgIlJlcGxpY2F0ZSIsICJUdV9pbnRyYSIsICJUZV9pbnRyYSIsICJUdV9pbnRlciIsICJUZV9pbnRlciIsICJUdV9pbnRyYV9MIiwgIlRlX2ludHJhX0wiLCAiVHVfaW50ZXJfTCIsICJUZV9pbnRlcl9MIiwgIlR1X2ludHJhX1UiLCAiVGVfaW50cmFfVSIsICJUdV9pbnRlcl9VIiwgIlRlX2ludGVyX1UiLCAiVHVfbGFtYmRhIiwgIlRlX2xhbWJkYSIsIlR1X2xhbWJkYV9MIiwgIlRlX2xhbWJkYV9MIiwiVHVfbGFtYmRhX1UiLCAiVGVfbGFtYmRhX1UiKQoKCmFscGhhc19tYXRfRV9sb25nPC1nYXRoZXIoYWxwaGFzX21hdF9FLCBwYXJhbWV0ZXIsIHZhbHVlLFR1X2ludHJhOlRlX2xhbWJkYV9VICkKCmFscGhhc19tYXRfRV9sb25nJGNhdGVnb3J5PC1tYXB2YWx1ZXMoYWxwaGFzX21hdF9FX2xvbmckcGFyYW1ldGVyLCBjKCJUdV9pbnRyYSIsICJUZV9pbnRyYSIsICJUdV9pbnRlciIsICJUZV9pbnRlciIsICJUdV9pbnRyYV9MIiwgIlRlX2ludHJhX0wiLCAiVHVfaW50ZXJfTCIsICJUZV9pbnRlcl9MIiwgIlR1X2ludHJhX1UiLCAiVGVfaW50cmFfVSIsICJUdV9pbnRlcl9VIiwgIlRlX2ludGVyX1UiLCAiVHVfbGFtYmRhIiwgIlRlX2xhbWJkYSIsIlR1X2xhbWJkYV9MIiwgIlRlX2xhbWJkYV9MIiwiVHVfbGFtYmRhX1UiLCAiVGVfbGFtYmRhX1UiKSwgYygiaW50cmEiLCAiaW50cmEiLCAiaW50ZXIiLCAiaW50ZXIiLCAiaW50cmFfTCIsICJpbnRyYV9MIiwgImludGVyX0wiLCAiaW50ZXJfTCIsImludHJhX1UiLCAiaW50cmFfVSIsICJpbnRlcl9VIiwgImludGVyX1UiLCJsYW1iZGEiLCJsYW1iZGEiLCJsYW1iZGFfTCIsImxhbWJkYV9MIiwibGFtYmRhX1UiLCJsYW1iZGFfVSIpKQoKc3RyKGFscGhhc19tYXRfRV9sb25nKQoKIyMjIyMjIyMjIyMKCgpnZ3Bsb3Qoc3Vic2V0KGFscGhhc19tYXRfRV9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRyYSIgJiBUdV9SZWdpbWU9PSIxIiAmIEVudmlyb25tZW50PT0iQyIpLCBhZXMoeD1UZV9SZWdpbWUsIHk9dmFsdWUsIGZpbGw9VGVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC41KSwgYWVzKHNoYXBlPVJlcGxpY2F0ZSkpKwogIHRoZW1lX2luZXMrCiAgI3NjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbChjKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQoKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8yNk1heV9SS19pbnRyYVRlX3cwX3JlcF9DRC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0VfbG9uZywgcGFyYW1ldGVyPT0iVGVfaW50cmEiICYgVHVfUmVnaW1lPT0iMSIgJiBFbnZpcm9ubWVudD09Ik4iKSwgYWVzKHg9VGVfUmVnaW1lLCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8yNk1heV9SS19pbnRyYVRlX3cwX3JlcF9OLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgpnZ3Bsb3Qoc3Vic2V0KGFscGhhc19tYXRfRV9sb25nLCBwYXJhbWV0ZXI9PSJUdV9pbnRyYSIgJiBUZV9SZWdpbWU9PSI0IiAmIEVudmlyb25tZW50PT0iQyIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9VHVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIk5vIGNhZG1pdW0iLCAiQ2FkbWl1bSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIkVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8yNk1heV9SS19pbnRyYVR1X3cwX3JlcF9DRC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0VfbG9uZywgcGFyYW1ldGVyPT0iVHVfaW50cmEiICYgVGVfUmVnaW1lPT0iNCIgJiBFbnZpcm9ubWVudD09Ik4iKSwgYWVzKGZpbGw9VHVfUmVnaW1lLCB5PXZhbHVlLCB4PVR1X1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBhZXMoc2hhcGU9UmVwbGljYXRlKSkrCiAgdGhlbWVfaW5lcysKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSxsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIHVydGljYWUpIikrCiAgeGxhYigiRW52aXJvbm1lbnQiKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvb3B0aW1fbGFtYmRhX2ZpeGVkLzI2TWF5X1JLX2ludHJhVHVfdzBfcmVwX04ucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCiMjIyMjIyMjIElOVEVSCgpnZ3Bsb3Qoc3Vic2V0KGFscGhhc19tYXRfRV9sb25nLCBwYXJhbWV0ZXI9PSJUZV9pbnRlciIgJiBFbnZpcm9ubWVudD09IkMiKSwgYWVzKHg9VGVfUmVnaW1lLCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGZhY2V0X2dyaWQoLn5UdV9SZWdpbWUsIGxhYmVsbGVyPWxhYmVsbGVyKFR1X1JlZ2ltZT1yZWdpbWVUdSwgVGVfUmVnaW1lPXJlZ2ltZVRlKSkrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyPSJkYXJrZ3JheSIpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwoYygiI0ZGQ0M5OSIsICIjRDU1RTMwIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludGVyc3BlY2lmaWMgY29tcGV0aXRpb24gKFQuIGV2YW5zaSkiKSsKICB4bGFiKCJTZWxlY3Rpb24gcmVnaW1lIFQuIGV2YW5zaSIpKwogIGdndGl0bGUoIkVudmlyb25tZW50OiBjYWRtaXVtIikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8yNk1heV9SS19pbnRlclRlX3cwX3JlcF9DZC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0VfbG9uZywgcGFyYW1ldGVyPT0iVGVfaW50ZXIiICYgRW52aXJvbm1lbnQ9PSJOIiksIGFlcyh4PVRlX1JlZ2ltZSwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBmYWNldF9ncmlkKC5+VHVfUmVnaW1lLCBsYWJlbGxlcj1sYWJlbGxlcihUdV9SZWdpbWU9cmVnaW1lVHUsIFRlX1JlZ2ltZT1yZWdpbWVUZSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91cj0iZGFya2dyYXkiKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBhZXMoc2hhcGU9UmVwbGljYXRlKSkrCiAgdGhlbWVfaW5lcysKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRlcnNwZWNpZmljIGNvbXBldGl0aW9uIChULiBldmFuc2kpIikrCiAgeGxhYigiU2VsZWN0aW9uIHJlZ2ltZSBULiBldmFuc2kiKSsKICBnZ3RpdGxlKCJFbnZpcm9ubWVudDogY29udHJvbCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvMjZNYXlfUktfaW50ZXJUZV93MF9yZXBfTi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0VfbG9uZywgcGFyYW1ldGVyPT0iVHVfaW50ZXIiICYgRW52aXJvbm1lbnQ9PSJDIiksIGFlcyhmaWxsPVR1X1JlZ2ltZSwgeT12YWx1ZSwgeD1UdV9SZWdpbWUpKSsKICBmYWNldF9ncmlkKC5+VGVfUmVnaW1lLCBsYWJlbGxlcj1sYWJlbGxlcihUdV9SZWdpbWU9cmVnaW1lVHUsIFRlX1JlZ2ltZT1yZWdpbWVUZSkpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91cj0iZGFya2dyYXkiKSsKICBnZW9tX2JveHBsb3Qob3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQoIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjc1KSwgYWVzKHNoYXBlPVJlcGxpY2F0ZSkpKwogIHRoZW1lX2luZXMrCiBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50ZXJzcGVjaWZpYyBjb21wZXRpdGlvbiAoVC4gdXJ0aWNhZSkiKSsKICB4bGFiKCJTZWxlY3Rpb24gcmVnaW1lIFQuIHVydGljYWUiKSsKICBnZ3RpdGxlKCJFbnZpcm9ubWVudDogY2FkbWl1bSIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvMjZNYXlfUktfaW50ZXJUdV93MF9yZXBfQ2QucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQoYWxwaGFzX21hdF9FX2xvbmcsIHBhcmFtZXRlcj09IlR1X2ludGVyIiAmIEVudmlyb25tZW50PT0iTiIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9VHVfUmVnaW1lKSkrCiAgZmFjZXRfZ3JpZCguflRlX1JlZ2ltZSwgbGFiZWxsZXI9bGFiZWxsZXIoVHVfUmVnaW1lPXJlZ2ltZVR1LCBUZV9SZWdpbWU9cmVnaW1lVGUpKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXI9ImRhcmtncmF5IikrCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZTIoMC43NSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjOTlGRjk5IiwgIiMwMDlFNzMiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICB5bGFiKCJJbnRlcnNwZWNpZmljIGNvbXBldGl0aW9uIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUgVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIkVudmlyb25tZW50OiBjb250cm9sIikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8yNk1heV9SS19pbnRlclR1X3cwX3JlcF9OLnBkZiIsIHdpZHRoPTIwLCBoZWlnaHQ9MTUpCgojIyMjIyMjIyMgTGFtYmRhCgpnZ3Bsb3Qoc3Vic2V0KGFscGhhc19tYXRfRV9sb25nLCBwYXJhbWV0ZXI9PSJUZV9sYW1iZGEiICYgVHVfUmVnaW1lPT0iMSIgJiBFbnZpcm9ubWVudD09IkMiKSwgYWVzKHg9VGVfUmVnaW1lLCB5PXZhbHVlLCBmaWxsPVRlX1JlZ2ltZSkpKwogIGdlb21fYm94cGxvdCggb3V0bGllci5hbHBoYSA9IDAuMDEpKwogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJpbnNpYyBncm93dGggcmF0ZSAoVC4gZXZhbnNpKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUgVC4gZXZhbnNpIikrCiAgZ2d0aXRsZSgiRW52aXJvbm1lbnQ6IGNhZG1pdW0iKQpzYXZlX3Bsb3QoIi4vTmV3QW5hbHlzZXMvb3B0aW1fbGFtYmRhX2ZpeGVkLzI2TWF5X1JLX2xhbWJkYVRlX3cwX3JlcF9DRC5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKZ2dwbG90KHN1YnNldChhbHBoYXNfbWF0X0VfbG9uZywgcGFyYW1ldGVyPT0iVGVfbGFtYmRhIiAmIFR1X1JlZ2ltZT09IjEiICYgRW52aXJvbm1lbnQ9PSJOIiksIGFlcyh4PVRlX1JlZ2ltZSwgeT12YWx1ZSwgZmlsbD1UZV9SZWdpbWUpKSsKICBnZW9tX2JveHBsb3QoIG91dGxpZXIuYWxwaGEgPSAwLjAxKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlMigwLjUpLCBhZXMoc2hhcGU9UmVwbGljYXRlKSkrCiAgdGhlbWVfaW5lcysKICAjc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTm8gY2FkbWl1bSIsICJDYWRtaXVtIikpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDQzk5IiwgIiNENTVFMzAiKSwgbGFiZWxzPWMoIkNvbnRyb2wiLCAiRXZvbHZlZCIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKGMoIiNGRkNDOTkiLCAiI0Q1NUUzMCIpLCBsYWJlbHM9YygiQ29udHJvbCIsICJFdm9sdmVkIikpKwogIHlsYWIoIkludHJpbnNpYyBncm93dGggcmF0ZSAoVC4gZXZhbnNpKSIpKwogICAgeGxhYigiU2VsZWN0aW9uIHJlZ2ltZSBULiBldmFuc2kiKSsKICBnZ3RpdGxlKCJFbnZpcm9ubWVudDogY29udHJvbCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvMjZNYXlfUktfbGFtYmRhVGVfdzBfcmVwX04ucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQoYWxwaGFzX21hdF9FX2xvbmcsIHBhcmFtZXRlcj09IlR1X2xhbWJkYSIgJiBUZV9SZWdpbWU9PSI0IiAmIEVudmlyb25tZW50PT0iQyIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9VHVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmluc2ljIGdyb3d0aCByYXRlIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUgVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIkVudmlyb25tZW50OiBjYWRtaXVtIikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8yNk1heV9SS19sYW1iZGFUdV93MF9yZXBfQ0QucGRmIiwgd2lkdGg9MjAsIGhlaWdodD0xNSkKCmdncGxvdChzdWJzZXQoYWxwaGFzX21hdF9FX2xvbmcsIHBhcmFtZXRlcj09IlR1X2xhbWJkYSIgJiBUZV9SZWdpbWU9PSI0IiAmIEVudmlyb25tZW50PT0iTiIpLCBhZXMoZmlsbD1UdV9SZWdpbWUsIHk9dmFsdWUsIHg9VHVfUmVnaW1lKSkrCiAgZ2VvbV9ib3hwbG90KCBvdXRsaWVyLmFscGhhID0gMC4wMSkrCiAgZ2VvbV9wb2ludCggcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGFlcyhzaGFwZT1SZXBsaWNhdGUpKSsKICB0aGVtZV9pbmVzKwogICNzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJObyBjYWRtaXVtIiwgIkNhZG1pdW0iKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM5OUZGOTkiLCAiIzAwOUU3MyIpLGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiIzk5RkY5OSIsICIjMDA5RTczIiksIGxhYmVscz1jKCJDb250cm9sIiwgIkV2b2x2ZWQiKSkrCiAgeWxhYigiSW50cmluc2ljIGdyb3d0aCByYXRlIChULiB1cnRpY2FlKSIpKwogIHhsYWIoIlNlbGVjdGlvbiByZWdpbWUgVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIkVudmlyb25tZW50OiBjb250cm9sIikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC8yNk1heV9SS19sYW1iZGFUdV93MF9yZXBfTi5wZGYiLCB3aWR0aD0yMCwgaGVpZ2h0PTE1KQoKCmBgYAoKIyMjIyMjIyMjIFByZWRpY3RpbmcgZGF0YQoKYGBge3J9CnN0cihhbHBoYXNfbWF0X0UpCgphbHBoYXNfbWF0X0UkRW52MjwtbWFwdmFsdWVzKGFscGhhc19tYXRfRSRFbnZpcm9ubWVudCwgYygiQyIsICJOIiksIGMoIkNkIiwiTiIpKQpzdHIoY2EpCgojIFNpbmNlIHRoZSBsYW1iZGEgaXMgZnJvbSB0aGUgbG9nIGRhdGEKY2EkcHJlZF9FPC1zYXBwbHkoYygxOmxlbmd0aChjYSRCbG9jaykpLCBmdW5jdGlvbih4KXsKICBpZihjYSRGb2NhbGZlbWFsZVt4XT09IlR1Iil7CiAgICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFR1X1JlZ2ltZT09YXMuY2hhcmFjdGVyKGNhJEZvY2FsU1JbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUdV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBUZV9SZWdpbWU9PWNhJENvbXBTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUdV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFR1X1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUdV9sYW1iZGFbMV0KICAgIAogIH1lbHNlIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVGUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUZV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBUdV9SZWdpbWU9PWNhJENvbXBTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9sYW1iZGFbMV0KICB9CiAgCiAgaWYoY2EkVHlwZVt4XT09IklOVFJBIil7CiAgICBkZW5zRjwtY2EkRGVuc1t4XQogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaSpkZW5zRikKICAgIAogIH1lbHNlIGlmKGNhJFR5cGVbeF09PSJJTlRFUiIpewogICAgZGVuc0M8LWNhJERlbnNbeF0KICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKmRlbnNDKQogIH0KICAgIAogIHByZWQKICAKfSkKeDwtMQpjYSRwcmVkX0VfTDwtc2FwcGx5KGMoMTpsZW5ndGgoY2EkQmxvY2spKSwgZnVuY3Rpb24oeCl7CiAgaWYoY2EkRm9jYWxmZW1hbGVbeF09PSJUdSIpewogICAgYWxwaGFfaTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUdV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVHVfaW50cmFfTFsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgVGVfUmVnaW1lPT1jYSRDb21wU1JbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVHVfaW50ZXJfTFsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFR1X1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUdV9sYW1iZGFfTFsxXQogICAgCiAgfWVsc2UgaWYoY2EkRm9jYWxmZW1hbGVbeF09PSJUZSIpewogICAgYWxwaGFfaTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUZV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfaW50cmFfTFsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgVHVfUmVnaW1lPT1jYSRDb21wU1JbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfaW50ZXJfTFsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9sYW1iZGFfTFsxXQogIH0KICAKICBpZihjYSRUeXBlW3hdPT0iSU5UUkEiKXsKICAgIGRlbnNGPC1jYSREZW5zW3hdCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKmRlbnNGKQogICAgCiAgfWVsc2UgaWYoY2EkVHlwZVt4XT09IklOVEVSIil7CiAgICBkZW5zQzwtY2EkRGVuc1t4XS0xCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipkZW5zQykKICB9CiAgICAKICBwcmVkCiAgCn0pCgpjYSRwcmVkX0VfVTwtc2FwcGx5KGMoMTpsZW5ndGgoY2EkQmxvY2spKSwgZnVuY3Rpb24oeCl7CiBpZihjYSRGb2NhbGZlbWFsZVt4XT09IlR1Iil7CiAgICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFR1X1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUdV9pbnRyYV9VWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUdV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBUZV9SZWdpbWU9PWNhJENvbXBTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUdV9pbnRlcl9VWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2xhbWJkYV9VWzFdCiAgICAKICB9ZWxzZSBpZihjYSRGb2NhbGZlbWFsZVt4XT09IlRlIil7CiAgICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09Y2EkRm9jYWxTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9pbnRyYV9VWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUZV9SZWdpbWU9PWNhJEZvY2FsU1JbeF0gJiBUdV9SZWdpbWU9PWNhJENvbXBTUlt4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9pbnRlcl9VWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2xhbWJkYV9VWzFdCiAgfQogIAogIGlmKGNhJFR5cGVbeF09PSJJTlRSQSIpewogICAgZGVuc0Y8LWNhJERlbnNbeF0KICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqZGVuc0YpCiAgICAKICB9ZWxzZSBpZihjYSRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGRlbnNDPC1jYSREZW5zW3hdLTEKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2lqKmRlbnNDKQogIH0KICAgIAogIHByZWQKICAKfSkKCmBgYAoKIyMjIFByZWRpY3RpbmcgZWFjaCBkZW5zaXR5CgpgYGB7cn0KZGVuc2l0eV9hdXg8LXNlcSgwLCAxMCwgYnk9KDEwLzEwMCkpCgpwcmVkX2RmX0U8LWFzLmRhdGEuZnJhbWUoZXhwYW5kX2dyaWQoRGVuc2l0eT1kZW5zaXR5X2F1eCwgVHVfUmVnaW1lPWMoMSwyKSwgVGVfUmVnaW1lPWMoNCw1KSwgUmVwbGljYXRlPWMoMTo1KSwgRW52aXJvbm1lbnQ9YygiTiIsICJDIikpKQoKcHJlZF9kZl9FJFR1X21lYW5faW50cmE8LXNhcHBseShjKDE6bGVuZ3RoKHByZWRfZGZfRVssMV0pKSwgZnVuY3Rpb24oeCl7CiAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudmlyb25tZW50PT1wcmVkX2RmX0UkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRSRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRSRSZXBsaWNhdGVbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqcHJlZF9kZl9FJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRSRUdV9tZWFuX2ludGVyPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0VbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0UkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudmlyb25tZW50PT1wcmVkX2RmX0UkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRSRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRSRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRSRSZXBsaWNhdGVbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudmlyb25tZW50PT1wcmVkX2RmX0UkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRSRUdV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRSRSZXBsaWNhdGVbeF0pJFR1X2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9paipwcmVkX2RmX0UkRGVuc2l0eVt4XSkKICAgIAogICAgcHJlZAp9KQoKCnByZWRfZGZfRSRUdV9pbnRyYV9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0VbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0UkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUdV9pbnRyYV9MWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJfTFsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0UkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUdV9sYW1iZGFfTFsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfRSREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX0UkVHVfaW50ZXJfTDwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9FWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVHVfaW50cmFfTFsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudmlyb25tZW50PT1wcmVkX2RmX0UkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRSRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRSRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRSRSZXBsaWNhdGVbeF0pJFR1X2ludGVyX0xbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhX0xbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9FJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRSRUdV9pbnRyYV9VPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0VbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0UkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUdV9pbnRyYV9VWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVHVfaW50ZXJfVVsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0UkVHVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUdV9sYW1iZGFfVVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfRSREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX0UkVHVfaW50ZXJfVTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9FWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVHVfaW50cmFfVVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudmlyb25tZW50PT1wcmVkX2RmX0UkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRSRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRSRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRSRSZXBsaWNhdGVbeF0pJFR1X2ludGVyX1VbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVHVfbGFtYmRhX1VbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9FJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRSRUZV9tZWFuX2ludHJhPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0VbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0UkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudmlyb25tZW50PT1wcmVkX2RmX0UkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRSRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRSRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRSRSZXBsaWNhdGVbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudmlyb25tZW50PT1wcmVkX2RmX0UkRW52aXJvbm1lbnRbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRSRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRSRSZXBsaWNhdGVbeF0pJFRlX2xhbWJkYVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfRSREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX0UkVGVfbWVhbl9pbnRlcjwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9FWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVGVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVHVfUmVnaW1lPT1wcmVkX2RmX0UkVHVfUmVnaW1lW3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0UkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0UkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9FJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRSRUZV9pbnRyYV9MPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0VbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0UkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUZV9pbnRyYV9MWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJfTFsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0UkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFfTFsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfRSREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX0UkVGVfaW50ZXJfTDwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9FWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVGVfaW50cmFfTFsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudmlyb25tZW50PT1wcmVkX2RmX0UkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRSRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRSRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRSRSZXBsaWNhdGVbeF0pJFRlX2ludGVyX0xbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVGVfbGFtYmRhX0xbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9FJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCnByZWRfZGZfRSRUZV9pbnRyYV9VPC1zYXBwbHkoYygxOmxlbmd0aChwcmVkX2RmX0VbLDFdKSksIGZ1bmN0aW9uKHgpewogICBhbHBoYV9pPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0UkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUZV9pbnRyYV9VWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFR1X1JlZ2ltZT09cHJlZF9kZl9FJFR1X1JlZ2ltZVt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVGVfaW50ZXJfVVsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnZpcm9ubWVudD09cHJlZF9kZl9FJEVudmlyb25tZW50W3hdICYgVGVfUmVnaW1lPT1wcmVkX2RmX0UkVGVfUmVnaW1lW3hdICYgUmVwbGljYXRlPT1wcmVkX2RmX0UkUmVwbGljYXRlW3hdKSRUZV9sYW1iZGFfVVsxXQogICAgCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKnByZWRfZGZfRSREZW5zaXR5W3hdKQogICAgCiAgICBwcmVkCn0pCgpwcmVkX2RmX0UkVGVfaW50ZXJfVTwtc2FwcGx5KGMoMTpsZW5ndGgocHJlZF9kZl9FWywxXSkpLCBmdW5jdGlvbih4KXsKICAgYWxwaGFfaTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVGVfaW50cmFfVVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudmlyb25tZW50PT1wcmVkX2RmX0UkRW52aXJvbm1lbnRbeF0gJiBUdV9SZWdpbWU9PXByZWRfZGZfRSRUdV9SZWdpbWVbeF0gJiBUZV9SZWdpbWU9PXByZWRfZGZfRSRUZV9SZWdpbWVbeF0gJiBSZXBsaWNhdGU9PXByZWRfZGZfRSRSZXBsaWNhdGVbeF0pJFRlX2ludGVyX1VbMV0KICAgIGxhbWJkYTwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52aXJvbm1lbnQ9PXByZWRfZGZfRSRFbnZpcm9ubWVudFt4XSAmIFRlX1JlZ2ltZT09cHJlZF9kZl9FJFRlX1JlZ2ltZVt4XSAmIFJlcGxpY2F0ZT09cHJlZF9kZl9FJFJlcGxpY2F0ZVt4XSkkVGVfbGFtYmRhX1VbMV0KICAgIAogICAgcHJlZDwtbGFtYmRhKmV4cCgtYWxwaGFfaWoqcHJlZF9kZl9FJERlbnNpdHlbeF0pCiAgICAKICAgIHByZWQKfSkKCiMgUmVtb3ZpbmcgVHUgZXZvbHZlZCByZXBsaWNhdGUgMiBiZWNhdXNlIHRoZXJlIGlzIG5vIGRhdGEKcHJlZF9kZl9FPC1wcmVkX2RmX0VbLXdoaWNoKHByZWRfZGZfRSRUdV9SZWdpbWU9PTIgJiBwcmVkX2RmX0UkUmVwbGljYXRlPT0yKSxdCgoKCiMgVHJhbnNmb3JtaW5nIGV2ZXJ5dGhpbmcgYmVsbG93IDAgaW50byAwIGZvciB0aGUgbG93ZXIgaW50ZXJ2YWwKCnByZWRfZGZfRSRUZV9pbnRlcl9MW3doaWNoKHByZWRfZGZfRSRUZV9pbnRlcl9MPDApXTwtMApwcmVkX2RmX0UkVGVfaW50cmFfTFt3aGljaChwcmVkX2RmX0UkVGVfaW50cmFfTDwwKV08LTAKcHJlZF9kZl9FJFR1X2ludGVyX0xbd2hpY2gocHJlZF9kZl9FJFR1X2ludGVyX0w8MCldPC0wCnByZWRfZGZfRSRUdV9pbnRyYV9MW3doaWNoKHByZWRfZGZfRSRUdV9pbnRyYV9MPDApXTwtMAoKCgpgYGAKCiMjIyBQbG90dGluZyBwcmVkaWN0aW9ucwoKIyMjIyMgQ09OVFJPTCBJTlRSQQoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludHJhX0wsIHltYXg9VHVfaW50cmFfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJOIiApLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50cmEpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MSAmIEVudj09Ik4iICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMtMSwgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiBULiB1cnRpY2FlIikrCiAgZ2d0aXRsZSgiVHUgY29udHJvbCBpbnRyYXNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQpgYGAKCgpgYGB7cn0KY2EkUmVwbGljYXRlPC1hcy5jaGFyYWN0ZXIoY2EkUmVwKQoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUdV9SZWdpbWU9PTEgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50cmFfTCwgeW1heD1UdV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUdV9SZWdpbWU9PTEgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0xICYgRW52PT0iTiIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucy0xLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIFQuIHVydGljYWUiKSsKICBnZ3RpdGxlKCJUdSBjb250cm9sIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvcHJlZF9UdV9JTlRSQV9Db250cm9sX3dhdGVyLnBkZiIsIHdpZHRoPTI1LCBoZWlnaHQ9MTApCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MSAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MSAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucy0xLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICAgIHlsYWIoIkludHJhc3BlY2lmaWMgY29tcGV0aXRpb24gVC4gdXJ0aWNhZSIpKwogIGdndGl0bGUoIlR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC9wcmVkX1R1X0lOVFJBX0NvbnRyb2xfY2FkbWl1bS5wZGYiLCB3aWR0aD0yNSwgaGVpZ2h0PTEwKQoKI3N1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MSAmIEVudmlyb25tZW50PT0iQyIgJiBSZXBsaWNhdGU9PTMpCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRyYV9MLCB5bWF4PVRlX2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0UsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLTEsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogICAgeWxhYigiSW50cmFzcGVjaWZpYyBjb21wZXRpdGlvbiBULiBldmFuc2kiKSsKICBnZ3RpdGxlKCJUZSBjb250cm9sIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCnNhdmVfcGxvdCgiLi9OZXdBbmFseXNlcy9vcHRpbV9sYW1iZGFfZml4ZWQvcHJlZF9UZV9JTlRSQV9Db250cm9sX2NvbnRyb2wucGRmIiwgd2lkdGg9MjUsIGhlaWdodD0xMCkKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUZV9SZWdpbWU9PTQgJiBFbnZpcm9ubWVudD09IkMiICksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50cmFfTCwgeW1heD1UZV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUZV9SZWdpbWU9PTQgJiBFbnZpcm9ubWVudD09IkMiICksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT00ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVFJBIiksIGFlcyh4PURlbnMtMSwgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgICB5bGFiKCJJbnRyYXNwZWNpZmljIGNvbXBldGl0aW9uIFQuIGV2YW5zaSIpKwogIGdndGl0bGUoIlRlIGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjYWRtaXVtIGVudmlyb25tZW50IikKc2F2ZV9wbG90KCIuL05ld0FuYWx5c2VzL29wdGltX2xhbWJkYV9maXhlZC9wcmVkX1RlX0lOVFJBX0NvbnRyb2xfY2FkbWl1bS5wZGYiLCB3aWR0aD0yNSwgaGVpZ2h0PTEwKQoKYGBgCgojIyMjIyBDT05UUk9MIElOVEVSIHZzIGNvbnRyb2wKCmBgYHtyfQpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MSAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PTQpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludGVyX0wsIHltYXg9VHVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09NCksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0xICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgJiBUZSBjb250cm9sIGludGVyc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCiAgCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJDIiAmIFRlX1JlZ2ltZT09NCksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50ZXJfTCwgeW1heD1UdV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUdV9SZWdpbWU9PTEgJiBFbnZpcm9ubWVudD09IkMiICYgVGVfUmVnaW1lPT00KSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTEgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgJiBUZSBjb250cm9sIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUZV9SZWdpbWU9PTQgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0xKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0UsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iTiIgJiBUdV9SZWdpbWU9PTEpLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NCAmIEVudj09Ik4iICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlICAmIFR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iQyIgJiBUdV9SZWdpbWU9PTEpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJDIiAmIFR1X1JlZ2ltZT09MSksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT00ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlICYgVHUgY29udHJvbCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKYGBgCgojIyMjIyBDT05UUk9MIElOVEVSIHZzIGV2b2x2ZWQKCmBgYHtyfQpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MSAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PTUpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludGVyX0wsIHltYXg9VHVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVHVfUmVnaW1lPT0xICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09NSksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0xICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT01KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgY29udHJvbCAmIFRlIGV2b2x2ZWQgaW50ZXJzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUdV9SZWdpbWU9PTEgJiBFbnZpcm9ubWVudD09IkMiICYgVGVfUmVnaW1lPT01KSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MSAmIEVudmlyb25tZW50PT0iQyIgJiBUZV9SZWdpbWU9PTUpLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MSAmIEVudj09IkNkIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTUpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBjb250cm9sICYgVGUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09MiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUZV9SZWdpbWU9PTQgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0yKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTQgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUZSBjb250cm9sICAmIFR1IGV2b2x2ZWQgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFRlX1JlZ2ltZT09NCAmIEVudmlyb25tZW50PT0iQyIgJiBUdV9SZWdpbWU9PTIpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVGVfUmVnaW1lPT00ICYgRW52aXJvbm1lbnQ9PSJDIiAmIFR1X1JlZ2ltZT09MiksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT00ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGNvbnRyb2wgICYgVHUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKYGBgCgojIyMjIyBDT05UUk9MIElOVFJBIGV2b2x2ZWQKCmBgYHtyfQpjYSRSZXBsaWNhdGU8LWFzLmNoYXJhY3RlcihjYSRSZXApCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iTiIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRSQSIpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBldm9sdmVkIGludHJhc3BlY2lmaWMgY29udHJvbCBlbnZpcm9ubWVudCIpCgpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRyYV9MLCB5bWF4PVR1X2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCBpbnRyYXNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUZV9SZWdpbWU9PTUgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50cmFfTCwgeW1heD1UZV9pbnRyYV9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUZV9SZWdpbWU9PTUgJiBFbnZpcm9ubWVudD09Ik4iICksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRyYSksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iTiIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgZXZvbHZlZCBpbnRyYXNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFRlX1JlZ2ltZT09NSAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRyYV9MLCB5bWF4PVRlX2ludHJhX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0UsIFRlX1JlZ2ltZT09NSAmIEVudmlyb25tZW50PT0iQyIgKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludHJhKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTUgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5UUkEiKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgZXZvbHZlZCBpbnRyYXNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKYGBgCgojIyMjIyBFdm9sdmVkIElOVEVSIHZzIGNvbnRyb2wKCmBgYHtyfQpnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iTiIgJiBUZV9SZWdpbWU9PTQpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludGVyX0wsIHltYXg9VHVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVHVfUmVnaW1lPT0yICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09NCksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0yICYgRW52PT0iTiIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT00KSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVHUgZXZvbHZlZCAmIFRlIGNvbnRyb2wgaW50ZXJzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUdV9SZWdpbWU9PTIgJiBFbnZpcm9ubWVudD09IkMiICYgVGVfUmVnaW1lPT00KSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UdV9pbnRlcl9MLCB5bWF4PVR1X2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iQyIgJiBUZV9SZWdpbWU9PTQpLCBhZXMoeD1EZW5zaXR5LCB5PVR1X21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09MiAmIEVudj09IkNkIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTQpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBldm9sdmVkICYgVGUgY29udHJvbCBpbnRlcnNwZWNpZmljIGNhZG1pdW0gZW52aXJvbm1lbnQiKQoKCmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVGVfUmVnaW1lPT01ICYgRW52aXJvbm1lbnQ9PSJOIiAmIFR1X1JlZ2ltZT09MSksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUZV9SZWdpbWU9PTUgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0xKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTUgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTEpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUZSBldm9sdmVkICAmIFR1IGNvbnRyb2wgaW50cmFzcGVjaWZpYyBjb250cm9sIGVudmlyb25tZW50IikKICAKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFRlX1JlZ2ltZT09NSAmIEVudmlyb25tZW50PT0iQyIgJiBUdV9SZWdpbWU9PTEpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVRlX2ludGVyX0wsIHltYXg9VGVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVGVfUmVnaW1lPT01ICYgRW52aXJvbm1lbnQ9PSJDIiAmIFR1X1JlZ2ltZT09MSksIGFlcyh4PURlbnNpdHksIHk9VGVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT01ICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgJiBUdSBjb250cm9sIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCiMjIyMjIGV2b2x2ZWQgSU5URVIgdnMgZXZvbHZlZAoKYGBge3J9CmdncGxvdCgpKwogIGZhY2V0X2dyaWQoLn5SZXBsaWNhdGUpKwogIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVHVfUmVnaW1lPT0yICYgRW52aXJvbm1lbnQ9PSJOIiAmIFRlX1JlZ2ltZT09NSksIGFlcyh4PURlbnNpdHksIHltaW49VHVfaW50ZXJfTCwgeW1heD1UdV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUdV9SZWdpbWU9PTIgJiBFbnZpcm9ubWVudD09Ik4iICYgVGVfUmVnaW1lPT01KSwgYWVzKHg9RGVuc2l0eSwgeT1UdV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTIgJiBFbnY9PSJOIiAmIFR5cGU9PSJJTlRFUiIgJiBDb21wU1I9PTUpLCBhZXMoeD1EZW5zLCB5PUdyb3d0aFJhdGVPQSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWVfaW5lcysKICBnZ3RpdGxlKCJUdSBldm9sdmVkICYgVGUgZXZvbHZlZCBpbnRlcnNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICBnZW9tX3JpYmJvbihkYXRhPXN1YnNldChwcmVkX2RmX0UsIFR1X1JlZ2ltZT09MiAmIEVudmlyb25tZW50PT0iQyIgJiBUZV9SZWdpbWU9PTUpLCBhZXMoeD1EZW5zaXR5LCB5bWluPVR1X2ludGVyX0wsIHltYXg9VHVfaW50ZXJfVSksIGFscGhhPTAuODUsIGNvbG91cj0iYmxhY2siLCBmaWxsPSJsaWdodGdyYXkiLCBsaW5ldHlwZT0iZGFzaGVkIikrCiAgZ2VvbV9saW5lKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVHVfUmVnaW1lPT0yICYgRW52aXJvbm1lbnQ9PSJDIiAmIFRlX1JlZ2ltZT09NSksIGFlcyh4PURlbnNpdHksIHk9VHVfbWVhbl9pbnRlciksIGNvbG91cj0iYmxhY2siKSsKICBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KGNhLCBGb2NhbFNSPT0yICYgRW52PT0iQ2QiICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09NSksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlR1IGV2b2x2ZWQgJiBUZSBldm9sdmVkIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgoKZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCguflJlcGxpY2F0ZSkrCiAgZ2VvbV9yaWJib24oZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUZV9SZWdpbWU9PTUgJiBFbnZpcm9ubWVudD09Ik4iICYgVHVfUmVnaW1lPT0yKSwgYWVzKHg9RGVuc2l0eSwgeW1pbj1UZV9pbnRlcl9MLCB5bWF4PVRlX2ludGVyX1UpLCBhbHBoYT0wLjg1LCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0ibGlnaHRncmF5IiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fbGluZShkYXRhPXN1YnNldChwcmVkX2RmX0UsIFRlX1JlZ2ltZT09NSAmIEVudmlyb25tZW50PT0iTiIgJiBUdV9SZWdpbWU9PTIpLCBhZXMoeD1EZW5zaXR5LCB5PVRlX21lYW5faW50ZXIpLCBjb2xvdXI9ImJsYWNrIikrCiAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChjYSwgRm9jYWxTUj09NSAmIEVudj09Ik4iICYgVHlwZT09IklOVEVSIiAmIENvbXBTUj09MiksIGFlcyh4PURlbnMsIHk9R3Jvd3RoUmF0ZU9BKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIGdndGl0bGUoIlRlIGV2b2x2ZWQgICYgVHUgZXZvbHZlZCBpbnRyYXNwZWNpZmljIGNvbnRyb2wgZW52aXJvbm1lbnQiKQogIApnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKC5+UmVwbGljYXRlKSsKICAgIGdlb21fcmliYm9uKGRhdGE9c3Vic2V0KHByZWRfZGZfRSwgVGVfUmVnaW1lPT01ICYgRW52aXJvbm1lbnQ9PSJDIiAmIFR1X1JlZ2ltZT09MiksIGFlcyh4PURlbnNpdHksIHltaW49VGVfaW50ZXJfTCwgeW1heD1UZV9pbnRlcl9VKSwgYWxwaGE9MC44NSwgY29sb3VyPSJibGFjayIsIGZpbGw9ImxpZ2h0Z3JheSIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX2xpbmUoZGF0YT1zdWJzZXQocHJlZF9kZl9FLCBUZV9SZWdpbWU9PTUgJiBFbnZpcm9ubWVudD09IkMiICYgVHVfUmVnaW1lPT0yKSwgYWVzKHg9RGVuc2l0eSwgeT1UZV9tZWFuX2ludGVyKSwgY29sb3VyPSJibGFjayIpKwogIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQoY2EsIEZvY2FsU1I9PTUgJiBFbnY9PSJDZCIgJiBUeXBlPT0iSU5URVIiICYgQ29tcFNSPT0yKSwgYWVzKHg9RGVucywgeT1Hcm93dGhSYXRlT0EpKSsKICB0aGVtZV9idygpKwogIHRoZW1lX2luZXMrCiAgZ2d0aXRsZSgiVGUgZXZvbHZlZCAgJiBUdSBldm9sdmVkIGludGVyc3BlY2lmaWMgY2FkbWl1bSBlbnZpcm9ubWVudCIpCgpgYGAKCgojIDQgLSBUZXN0aW5nIHNpbWlsYXJpdGllcyBpbiBlc3RpbWF0aW9uCgojIyMgQ29tcGFyZSBtZXRob2RzIHZpc3VhbGx5CgpgYGB7cn0KCiMgUHV0dGluZyBuYW1lcyBvZiBzZWxlY3Rpb24gcmVnaW1lcyBhbGwgdGhlIHNhbWUKYWxwaGFzX21hdF9EJFR1X1JlZ2ltZTI8LWFscGhhc19tYXRfRCRUdV9SZWdpbWUKYWxwaGFzX21hdF9EJFRlX1JlZ2ltZTI8LWFscGhhc19tYXRfRCRUZV9SZWdpbWUKCgphbHBoYXNfbWF0X0QkVHVfUmVnaW1lPC1tYXB2YWx1ZXMoYWxwaGFzX21hdF9EJFR1X1JlZ2ltZTIsIGMoIjEiLCIyIiwiNCIsIjUiKSwgYygiU1IxIiwgIlNSMiIsICJTUjQiLCJTUjUiKSkKYWxwaGFzX21hdF9EJFRlX1JlZ2ltZTwtbWFwdmFsdWVzKGFscGhhc19tYXRfRCRUZV9SZWdpbWUyLCBjKCIxIiwiMiIsIjQiLCI1IiksIGMoIlNSMSIsICJTUjIiLCAiU1I0IiwiU1I1IikpCgoKYWxwaGFzX21hdF9FJFR1X1JlZ2ltZTI8LWFscGhhc19tYXRfRSRUdV9SZWdpbWUKYWxwaGFzX21hdF9FJFRlX1JlZ2ltZTI8LWFscGhhc19tYXRfRSRUZV9SZWdpbWUKCgphbHBoYXNfbWF0X0UkVHVfUmVnaW1lPC1tYXB2YWx1ZXMoYWxwaGFzX21hdF9FJFR1X1JlZ2ltZTIsIGMoIjEiLCIyIiwiNCIsIjUiKSwgYygiU1IxIiwgIlNSMiIsICJTUjQiLCJTUjUiKSkKYWxwaGFzX21hdF9FJFRlX1JlZ2ltZTwtbWFwdmFsdWVzKGFscGhhc19tYXRfRSRUZV9SZWdpbWUyLCBjKCIxIiwiMiIsIjQiLCI1IiksIGMoIlNSMSIsICJTUjIiLCAiU1I0IiwiU1I1IikpCgoKIyBkb2luZyB0aGUgc2FtZSB3aXRoIHRoZSBlbnZpcm9ubWVudHMKCmFscGhhc19tYXRfRCRFbnZpcm9ubWVudDI8LWFscGhhc19tYXRfRCRFbnZpcm9ubWVudAoKYWxwaGFzX21hdF9EJEVudmlyb25tZW50PC1tYXB2YWx1ZXMoYWxwaGFzX21hdF9EJEVudmlyb25tZW50MiwgYygiTiIsIkMiKSwgYygiTiIsICJDZCIpKQoKYWxwaGFzX21hdF9FJEVudmlyb25tZW50MjwtYWxwaGFzX21hdF9FJEVudmlyb25tZW50CgphbHBoYXNfbWF0X0UkRW52aXJvbm1lbnQ8LW1hcHZhbHVlcyhhbHBoYXNfbWF0X0UkRW52aXJvbm1lbnQyLCBjKCJOIiwiQyIpLCBjKCJOIiwgIkNkIikpCgoKIyMjIEFkZGluZyB2YXJpYWJsZSB0byBzYXkgd2hvIGVzdGltYXRlZCB3aGF0CgpwYXJhbV9hbGxfdzAkTWV0aG9kPC0iY3hyIgpwYXJhbV9hbGxfQiRNZXRob2Q8LSJjeHIgbGFtYmRhIGZpeGVkIgpwYXJhbV9hbGxfQyRNZXRob2Q8LSJjeHIgbGFtYmRhIGZpeGVkLCBuZXN0ZWQiCmFscGhhc19tYXRfRCRNZXRob2Q8LSJvcHRpbSIKYWxwaGFzX21hdF9FJE1ldGhvZDwtIm9wdGltIGxhbWJkYSBmaXhlZCIKCmNvbHNfdG9fam9pbjwtYygiVHVfUmVnaW1lIiwgIlRlX1JlZ2ltZSIsICJFbnZpcm9ubWVudCIsICJSZXBsaWNhdGUiLCJUdV9sYW1iZGEiLCJUZV9sYW1iZGEiLCAiVHVfaW50cmEiLCJUZV9pbnRyYSIsICJUdV9pbnRlciIsICJUZV9pbnRlciIsICJNZXRob2QiICkKCmNvbXBhcmlzb25fbWV0aG9kczwtcmJpbmQocGFyYW1fYWxsX3cwWyxjb2xzX3RvX2pvaW5dLHBhcmFtX2FsbF9CWyxjb2xzX3RvX2pvaW5dLHBhcmFtX2FsbF9DWyxjb2xzX3RvX2pvaW5dLCBhbHBoYXNfbWF0X0RbLGNvbHNfdG9fam9pbl0sIGFscGhhc19tYXRfRVssY29sc190b19qb2luXSApCgpnZ3Bsb3QoY29tcGFyaXNvbl9tZXRob2RzLCBhZXMoeD1NZXRob2QsIHk9VHVfbGFtYmRhLCBjb2xvdXI9RW52aXJvbm1lbnQsIGZpbGw9RW52aXJvbm1lbnQsIHNoYXBlPVJlcGxpY2F0ZSkpKwogIGZhY2V0X2dyaWQoVHVfUmVnaW1lflRlX1JlZ2ltZSkrCiAgZ2VvbV9ib3hwbG90KGFlcyhncm91cD1NZXRob2QsIGZpbGw9RW52aXJvbm1lbnQpLCBhbHBoYT0wLjc1LCBvdXRsaWVyLmNvbG91ciA9IE5BKSsKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKDAuNSkpKwogIHRoZW1lX2luZXMrCiAgdGhlbWVfYncoKSsKICB4bGFiKCJNZXRob2RzIHVzZWQgdG8gZXN0aW1hdGUgZGF0YSIpKwogIHlsYWIoIlR1IGxhbWJkYSIpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoImN4ciIsICJjeHJcbmxhbWJkYSIsImN4clxubmVzdGVkIiwgIm9wdGltIiwgIm9wdGltXG5sYW1iZGEiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiZGFya2JsdWUiLCAiZGFya3JlZCIpKQoKZ2dwbG90KGNvbXBhcmlzb25fbWV0aG9kcywgYWVzKHg9TWV0aG9kLCB5PVRlX2xhbWJkYSwgY29sb3VyPUVudmlyb25tZW50LCBmaWxsPUVudmlyb25tZW50LCBzaGFwZT1SZXBsaWNhdGUpKSsKICBmYWNldF9ncmlkKFR1X1JlZ2ltZX5UZV9SZWdpbWUpKwogIGdlb21fYm94cGxvdChhZXMoZ3JvdXA9TWV0aG9kLCBmaWxsPUVudmlyb25tZW50KSwgYWxwaGE9MC43NSwgb3V0bGllci5jb2xvdXIgPSBOQSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHRoZW1lX2J3KCkrCiAgeGxhYigiTWV0aG9kcyB1c2VkIHRvIGVzdGltYXRlIGRhdGEiKSsKICB5bGFiKCJUZSBsYW1iZGEiKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJjeHIiLCAiY3hyXG5sYW1iZGEiLCJjeHJcbm5lc3RlZCIsICJvcHRpbSIsICJvcHRpbVxubGFtYmRhIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoImRhcmtibHVlIiwgImRhcmtyZWQiKSkKCgpnZ3Bsb3QoY29tcGFyaXNvbl9tZXRob2RzLCBhZXMoeD1NZXRob2QsIHk9VHVfaW50cmEsIGNvbG91cj1FbnZpcm9ubWVudCwgZmlsbD1FbnZpcm9ubWVudCwgc2hhcGU9UmVwbGljYXRlKSkrCiAgZmFjZXRfZ3JpZChUdV9SZWdpbWV+VGVfUmVnaW1lKSsKICBnZW9tX2JveHBsb3QoYWVzKGdyb3VwPU1ldGhvZCwgZmlsbD1FbnZpcm9ubWVudCksIGFscGhhPTAuNzUsIG91dGxpZXIuY29sb3VyID0gTkEpKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICB0aGVtZV9idygpKwogIHhsYWIoIk1ldGhvZHMgdXNlZCB0byBlc3RpbWF0ZSBkYXRhIikrCiAgeWxhYigiVHUgaW50cmEiKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJjeHIiLCAiY3hyXG5sYW1iZGEiLCJjeHJcbm5lc3RlZCIsICJvcHRpbSIsICJvcHRpbVxubGFtYmRhIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoImRhcmtibHVlIiwgImRhcmtyZWQiKSkKCmdncGxvdChjb21wYXJpc29uX21ldGhvZHMsIGFlcyh4PU1ldGhvZCwgeT1UZV9pbnRyYSwgY29sb3VyPUVudmlyb25tZW50LCBmaWxsPUVudmlyb25tZW50LCBzaGFwZT1SZXBsaWNhdGUpKSsKICBmYWNldF9ncmlkKFR1X1JlZ2ltZX5UZV9SZWdpbWUpKwogIGdlb21fYm94cGxvdChhZXMoZ3JvdXA9TWV0aG9kLCBmaWxsPUVudmlyb25tZW50KSwgYWxwaGE9MC43NSwgb3V0bGllci5jb2xvdXIgPSBOQSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHRoZW1lX2J3KCkrCiAgeGxhYigiTWV0aG9kcyB1c2VkIHRvIGVzdGltYXRlIGRhdGEiKSsKICB5bGFiKCJUZSBpbnRyYSIpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoImN4ciIsICJjeHJcbmxhbWJkYSIsImN4clxubmVzdGVkIiwgIm9wdGltIiwgIm9wdGltXG5sYW1iZGEiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiZGFya2JsdWUiLCAiZGFya3JlZCIpKQogIApnZ3Bsb3QoY29tcGFyaXNvbl9tZXRob2RzLCBhZXMoeD1NZXRob2QsIHk9VHVfaW50ZXIsIGNvbG91cj1FbnZpcm9ubWVudCwgZmlsbD1FbnZpcm9ubWVudCwgc2hhcGU9UmVwbGljYXRlKSkrCiAgZmFjZXRfZ3JpZChUdV9SZWdpbWV+VGVfUmVnaW1lKSsKICBnZW9tX2JveHBsb3QoYWVzKGdyb3VwPU1ldGhvZCwgZmlsbD1FbnZpcm9ubWVudCksIGFscGhhPTAuNzUsIG91dGxpZXIuY29sb3VyID0gTkEpKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIoMC41KSkrCiAgdGhlbWVfaW5lcysKICB0aGVtZV9idygpKwogIHhsYWIoIk1ldGhvZHMgdXNlZCB0byBlc3RpbWF0ZSBkYXRhIikrCiAgeWxhYigiVHUgaW50ZXIiKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJjeHIiLCAiY3hyXG5sYW1iZGEiLCJjeHJcbm5lc3RlZCIsICJvcHRpbSIsICJvcHRpbVxubGFtYmRhIikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoImRhcmtibHVlIiwgImRhcmtyZWQiKSkKCmdncGxvdChjb21wYXJpc29uX21ldGhvZHMsIGFlcyh4PU1ldGhvZCwgeT1UZV9pbnRlciwgY29sb3VyPUVudmlyb25tZW50LCBmaWxsPUVudmlyb25tZW50LCBzaGFwZT1SZXBsaWNhdGUpKSsKICBmYWNldF9ncmlkKFR1X1JlZ2ltZX5UZV9SZWdpbWUpKwogIGdlb21fYm94cGxvdChhZXMoZ3JvdXA9TWV0aG9kLCBmaWxsPUVudmlyb25tZW50KSwgYWxwaGE9MC43NSwgb3V0bGllci5jb2xvdXIgPSBOQSkrCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMigwLjUpKSsKICB0aGVtZV9pbmVzKwogIHRoZW1lX2J3KCkrCiAgeGxhYigiTWV0aG9kcyB1c2VkIHRvIGVzdGltYXRlIGRhdGEiKSsKICB5bGFiKCJUZSBpbnRlciIpKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoImN4ciIsICJjeHJcbmxhbWJkYSIsImN4clxubmVzdGVkIiwgIm9wdGltIiwgIm9wdGltXG5sYW1iZGEiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiZGFya2JsdWUiLCAiZGFya3JlZCIpKQoKYGBgCgojIyBFc3RpbWF0ZSBkaXN0YW5jZSBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgb2JzZXJ2ZWQKClNpbmNlIEkgY2FuJ3QgcmVhbGx5IGtub3cgd2hhdCBpcyB0aGUgYmVzdCBhcHByb2FjaCwgSSB3aWxsIGVzdGltYXRlIHRoZSBwcmVkaWN0ZWQgdnMgb2JzZXJ2ZWQgZm9yIGVhY2ggbWV0aG9kIGFuZCB1c2UgdGhhdCBhcyBtZXRyaWMgdG8gZGVmaW5lIHdoaWNoIG1ldGhvZCB0byB1c2UgaW4gdGhlIHJlc3VsdHMKCiMjIyMjIFByZWRpY3QgdmFsdWVzCmBgYHtyfQoKY2EkRm9jYWxTUjM8LW1hcHZhbHVlcyhjYSRGb2NhbFNSLCBjKDEsMiw0LDUpLCBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikpCgpjYSRDb21wU1IzPC1tYXB2YWx1ZXMoY2EkQ29tcFNSLCBjKDEsMiw0LDUpLCBjKCJTUjEiLCAiU1IyIiwiU1I0IiwiU1I1IikpCgpjYSRFbnYzPC1tYXB2YWx1ZXMoY2EkRW52LCBjKCJOIiwgIkNkIiksIGMoIk4iLCAiQyIpKQoKIyBTaW5jZSB0aGUgbGFtYmRhIGlzIGZyb20gdGhlIGxvZyBkYXRhCmNhJHByZWRfQTwtc2FwcGx5KGMoMTpsZW5ndGgoY2EkQmxvY2spKSwgZnVuY3Rpb24oeCl7CiAgaWYoY2EkRm9jYWxmZW1hbGVbeF09PSJUdSIpewogICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgVGVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkQ29tcFNSM1t4XSkgJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2xhbWJkYVsxXQogICAgCiAgfWVsc2UgaWYoY2EkRm9jYWxmZW1hbGVbeF09PSJUZSIpewogICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkQ29tcFNSM1t4XSkgJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF93MCwgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2xhbWJkYVsxXQogIH0KICAKICBpZihjYSRUeXBlW3hdPT0iSU5UUkEiKXsKICAgIGRlbnNGPC1jYSREZW5zW3hdCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKihkZW5zRikpCiAgICAKICB9ZWxzZSBpZihjYSRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGRlbnNDPC1jYSREZW5zW3hdLTEKICAgIGRlbnNGPC0xCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKihkZW5zRiktYWxwaGFfaWoqZGVuc0MpCiAgfQogICAgCiAgcHJlZAogIAp9KQoKCmNhJHByZWRfQjwtc2FwcGx5KGMoMTpsZW5ndGgoY2EkQmxvY2spKSwgZnVuY3Rpb24oeCl7CiAgaWYoY2EkRm9jYWxmZW1hbGVbeF09PSJUdSIpewogICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9CLCBFbnZpcm9ubWVudD09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUdV9SZWdpbWU9PWFzLmNoYXJhY3RlcihjYSRGb2NhbFNSM1t4XSkgJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVHVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0IsIEVudmlyb25tZW50PT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFR1X1JlZ2ltZT09YXMuY2hhcmFjdGVyKGNhJEZvY2FsU1IzW3hdKSAmIFRlX1JlZ2ltZT09YXMuY2hhcmFjdGVyKGNhJENvbXBTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQiwgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2xhbWJkYVsxXQogICAgCiAgfWVsc2UgaWYoY2EkRm9jYWxmZW1hbGVbeF09PSJUZSIpewogICAgYWxwaGFfaTwtc3Vic2V0KHBhcmFtX2FsbF9CLCBFbnZpcm9ubWVudD09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUZV9SZWdpbWU9PWFzLmNoYXJhY3RlcihjYSRGb2NhbFNSM1t4XSkgJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfaW50cmFbMV0KICAgIGFscGhhX2lqPC1zdWJzZXQocGFyYW1fYWxsX0IsIEVudmlyb25tZW50PT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09YXMuY2hhcmFjdGVyKGNhJEZvY2FsU1IzW3hdKSAmIFR1X1JlZ2ltZT09YXMuY2hhcmFjdGVyKGNhJENvbXBTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChwYXJhbV9hbGxfQiwgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFRlX2xhbWJkYVsxXQogIH0KICAKICBpZihjYSRUeXBlW3hdPT0iSU5UUkEiKXsKICAgIGRlbnNGPC1jYSREZW5zW3hdCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKihkZW5zRikpCiAgICAKICB9ZWxzZSBpZihjYSRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGRlbnNDPC1jYSREZW5zW3hdLTEKICAgIGRlbnNGPC0xCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKihkZW5zRiktYWxwaGFfaWoqZGVuc0MpCiAgfQogICAgCiAgcHJlZAogIAp9KQoKY2EkcHJlZF9DPC1zYXBwbHkoYygxOmxlbmd0aChjYSRCbG9jaykpLCBmdW5jdGlvbih4KXsKICBpZihjYSRGb2NhbGZlbWFsZVt4XT09IlR1Iil7CiAgICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX0MsIEVudmlyb25tZW50PT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFR1X1JlZ2ltZT09YXMuY2hhcmFjdGVyKGNhJEZvY2FsU1IzW3hdKSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUdV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQywgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgVGVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkQ29tcFNSM1t4XSkgJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVHVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF9DLCBFbnZpcm9ubWVudD09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUdV9SZWdpbWU9PWFzLmNoYXJhY3RlcihjYSRGb2NhbFNSM1t4XSkgJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVHVfbGFtYmRhWzFdCiAgICAKICB9ZWxzZSBpZihjYSRGb2NhbGZlbWFsZVt4XT09IlRlIil7CiAgICBhbHBoYV9pPC1zdWJzZXQocGFyYW1fYWxsX0MsIEVudmlyb25tZW50PT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09YXMuY2hhcmFjdGVyKGNhJEZvY2FsU1IzW3hdKSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChwYXJhbV9hbGxfQywgRW52aXJvbm1lbnQ9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkQ29tcFNSM1t4XSkgJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfaW50ZXJbMV0KICAgIGxhbWJkYTwtc3Vic2V0KHBhcmFtX2FsbF9DLCBFbnZpcm9ubWVudD09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUZV9SZWdpbWU9PWFzLmNoYXJhY3RlcihjYSRGb2NhbFNSM1t4XSkgJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfbGFtYmRhWzFdCiAgfQogIAogIGlmKGNhJFR5cGVbeF09PSJJTlRSQSIpewogICAgZGVuc0Y8LWNhJERlbnNbeF0KICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqKGRlbnNGKSkKICAgIAogIH1lbHNlIGlmKGNhJFR5cGVbeF09PSJJTlRFUiIpewogICAgZGVuc0M8LWNhJERlbnNbeF0tMQogICAgZGVuc0Y8LTEKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqKGRlbnNGKS1hbHBoYV9paipkZW5zQykKICB9CiAgICAKICBwcmVkCiAgCn0pCgpjYSRwcmVkX0Q8LXNhcHBseShjKDE6bGVuZ3RoKGNhJEJsb2NrKSksIGZ1bmN0aW9uKHgpewogIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVHUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRCwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUdV9SZWdpbWU9PWNhJEZvY2FsU1IzW3hdICYgVGVfUmVnaW1lPT1jYSRDb21wU1IzW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1jYSRGb2NhbFNSM1t4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUdV9sYW1iZGFbMV0KICAgIAogIH1lbHNlIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVGUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSM1t4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0QsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSM1t4XSAmIFR1X1JlZ2ltZT09Y2EkQ29tcFNSM1t4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9ELCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09Y2EkRm9jYWxTUjNbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfbGFtYmRhWzFdCiAgfQogIAogIGlmKGNhJFR5cGVbeF09PSJJTlRSQSIpewogICAgZGVuc0Y8LWNhJERlbnNbeF0KICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqKGRlbnNGKSkKICAgIAogIH1lbHNlIGlmKGNhJFR5cGVbeF09PSJJTlRFUiIpewogICAgZGVuc0M8LWNhJERlbnNbeF0tMQogICAgZGVuc0Y8LTEKICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqKGRlbnNGKS1hbHBoYV9paipkZW5zQykKICB9CiAgICAKICBwcmVkCiAgCn0pCgpjYSRwcmVkX0U8LXNhcHBseShjKDE6bGVuZ3RoKGNhJEJsb2NrKSksIGZ1bmN0aW9uKHgpewogIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVHUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1hcy5jaGFyYWN0ZXIoY2EkRm9jYWxTUjNbeF0pICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludHJhWzFdCiAgICBhbHBoYV9pajwtc3Vic2V0KGFscGhhc19tYXRfRSwgRW52Mj09YXMuY2hhcmFjdGVyKGNhJEVudlt4XSkgJiBUdV9SZWdpbWU9PWNhJEZvY2FsU1IzW3hdICYgVGVfUmVnaW1lPT1jYSRDb21wU1IzW3hdICYgUmVwbGljYXRlPT1jYSRSZXBbeF0pJFR1X2ludGVyWzFdCiAgICBsYW1iZGE8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVHVfUmVnaW1lPT1jYSRGb2NhbFNSM1t4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUdV9sYW1iZGFbMV0KICAgIAogIH1lbHNlIGlmKGNhJEZvY2FsZmVtYWxlW3hdPT0iVGUiKXsKICAgIGFscGhhX2k8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSM1t4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9pbnRyYVsxXQogICAgYWxwaGFfaWo8LXN1YnNldChhbHBoYXNfbWF0X0UsIEVudjI9PWFzLmNoYXJhY3RlcihjYSRFbnZbeF0pICYgVGVfUmVnaW1lPT1jYSRGb2NhbFNSM1t4XSAmIFR1X1JlZ2ltZT09Y2EkQ29tcFNSM1t4XSAmIFJlcGxpY2F0ZT09Y2EkUmVwW3hdKSRUZV9pbnRlclsxXQogICAgbGFtYmRhPC1zdWJzZXQoYWxwaGFzX21hdF9FLCBFbnYyPT1hcy5jaGFyYWN0ZXIoY2EkRW52W3hdKSAmIFRlX1JlZ2ltZT09Y2EkRm9jYWxTUjNbeF0gJiBSZXBsaWNhdGU9PWNhJFJlcFt4XSkkVGVfbGFtYmRhWzFdCiAgfQogIAogIGlmKGNhJFR5cGVbeF09PSJJTlRSQSIpewogICAgZGVuc0Y8LWNhJERlbnNbeF0KICAgIHByZWQ8LWxhbWJkYSpleHAoLWFscGhhX2kqZGVuc0YpCiAgICAKICB9ZWxzZSBpZihjYSRUeXBlW3hdPT0iSU5URVIiKXsKICAgIGRlbnNDPC1jYSREZW5zW3hdLTEKICAgIGRlbnNGPC0xCiAgICBwcmVkPC1sYW1iZGEqZXhwKC1hbHBoYV9pKihkZW5zRiktYWxwaGFfaWoqZGVuc0MpCiAgfQogICAgCiAgcHJlZAogIAp9KQoKYGBgCgojIyMgQ2FsY3VsYXRlIGRpc3RhbmNlcwoKRG8gbm90IGZvcmdldCB0aGF0IHRoaXMgaXMgdGhlIGxvZyBvZiBHUiArMQoKYGBge3J9CmV1Y2xpZGVhbiA8LSBmdW5jdGlvbihhLCBiKSBzcXJ0KHN1bSgoYSAtIGIpXjIpKQoKCmNhJGRpc3RBPC1zYXBwbHkoYygxOmxlbmd0aChjYSRCbG9jaykpLCBmdW5jdGlvbih4KXsKICBldWM8LWV1Y2xpZGVhbihjYSRwcmVkX0FbeF0sIGNhJEdyb3d0aFJhdGVPQVt4XSkKCiAgZXVjCn0pCgpjYSRkaXN0Qjwtc2FwcGx5KGMoMTpsZW5ndGgoY2EkQmxvY2spKSwgZnVuY3Rpb24oeCl7CiAgZXVjPC1ldWNsaWRlYW4oY2EkcHJlZF9CW3hdLCBjYSRHcm93dGhSYXRlT0FbeF0pCgogIGV1Ywp9KQoKY2EkZGlzdEM8LXNhcHBseShjKDE6bGVuZ3RoKGNhJEJsb2NrKSksIGZ1bmN0aW9uKHgpewogIGV1YzwtZXVjbGlkZWFuKGNhJHByZWRfQ1t4XSwgY2EkR3Jvd3RoUmF0ZU9BW3hdKQoKICBldWMKfSkKCmNhJGRpc3REPC1zYXBwbHkoYygxOmxlbmd0aChjYSRCbG9jaykpLCBmdW5jdGlvbih4KXsKICBldWM8LWV1Y2xpZGVhbihjYSRwcmVkX0RbeF0sIGNhJEdyb3d0aFJhdGVPQVt4XSkKCiAgZXVjCn0pCgpjYSRkaXN0RTwtc2FwcGx5KGMoMTpsZW5ndGgoY2EkQmxvY2spKSwgZnVuY3Rpb24oeCl7CiAgZXVjPC1ldWNsaWRlYW4oY2EkcHJlZF9FW3hdLCBjYSRHcm93dGhSYXRlT0FbeF0pCgogIGV1Ywp9KQoKaGlzdChjYSRkaXN0QSkKaGlzdChjYSRkaXN0QikKaGlzdChjYSRkaXN0QykKaGlzdChjYSRkaXN0RCkKaGlzdChjYSRkaXN0RSkKCnN1bShjYSRkaXN0QSwgbmEucm0gPSBUUlVFKQpzdW0oY2EkZGlzdEIsIG5hLnJtID0gVFJVRSkKc3VtKGNhJGRpc3RDLCBuYS5ybSA9IFRSVUUpCnN1bShjYSRkaXN0RCwgbmEucm0gPSBUUlVFKQpzdW0oY2EkZGlzdEUsIG5hLnJtID0gVFJVRSkKCgpgYGAKVGhlIHNtYWxsZXIgc3VtIG9mIGV1Y2xpZGVhbiBkaXN0YW5jZSBpcyB3aXRoIGN4ciBwYWNrYWdlLCBidXQgdGhlIGxhbWJkYSBlc3RpbWF0aW9uIGRvZXMgbm90IHNlZW0gdG8gcmVmbGVjdCB0aGUgcmVhbCBlc3RpbWF0ZXMgd2Ugb2J0YWluLCBzbyB3ZSB3aWxsIHVzZSB0aGUgY3hyIG5lc3RlZCBmaXhlZCwgd2hpY2ggaXMgdGhlIHNlY29uZCBiZXN0CgojIyMjIyBQbG90dGluZyBkaXN0YW5jZQpgYGB7cn0KZGlzdGFuY2Vfc3VtPC1waXZvdF9sb25nZXIoY2FbLCBjKDU1OjU5KV0sIGNvbHMgPSBjKDE6NSksbmFtZXNfdG8gPSAibWV0aG9kIiwgdmFsdWVzX3RvID0gImRpc3RhbmNlIikKCmRpc3Rfc3VtPC1kaXN0YW5jZV9zdW0gJT4lIGdyb3VwX2J5KG1ldGhvZCkgJT4lIHN1bW1hcml6ZShtZWFuPW1lYW4oZGlzdGFuY2UsIG5hLnJtPVRSVUUpLCBzZT1zZChkaXN0YW5jZSwgbmEucm09VFJVRSkvc3FydChuKCkpKQoKZ2dwbG90KGRpc3RhbmNlX3N1bSwgYWVzKHg9bWV0aG9kLCB5PWRpc3RhbmNlLCBjb2xvdXI9bWV0aG9kLCBmaWxsPW1ldGhvZCkpKwogICBnZW9tX2JveHBsb3QoY29sb3VyPSJibGFjayIsIG91dGxpZXIuY29sb3VyID0gTkEpKwogIGdlb21fcG9pbnQoYWxwaGE9MC4xMCwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UyKDAuNSksIGNvbG91cj0iYmxhY2siLCBzaGFwZT0yMSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZV9pbmVzKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoImN4ciIsICJjeHIgbGFtYmRhXG5maXhlZCIsICJjeHIgXG5uZXN0ZWQiLCAib3B0aW0iLCAib3B0aW0gXG5sYW1iZGEgZml4ZWQiKSwgbmFtZT0iTWV0aG9kIikrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNwZWN0cmFsIikrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsKICBnZW9tX3RleHQoZGF0YT1kaXN0X3N1bSwgYWVzKHg9bWV0aG9kLCBsYWJlbD1wYXN0ZShyb3VuZChtZWFuLDMpLCByb3VuZChzZSwzKSwgc2VwPSJcbisvLSIpKSwgeT0yMiwgY29sb3VyPSJibGFjayIpKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJFc3RpbWF0ZWQgZXVjbGlkZWFuIGRpc3RhbmNlXG4gKHByZWRpY3RlZC1vYnNlcnZlZCIpCgpzYXZlX3Bsb3QoIi4vUGxvdHMvRmlnUzIucGRmIiwgd2lkdGggPSAyMCwgaGVpZ2h0PTEwKQpzYXZlX3Bsb3QoIi4vUGxvdHMvRmlnUzIucG5nIiwgd2lkdGggPSAyMCwgaGVpZ2h0PTEwKQoKYGBgCgo=